سؤال

لذلك ليس لدي أي فكرة عن سبب ظهور هذا الخطأ.رسالة الخطأ هي كما يلي:

* إنهاء التطبيق بسبب الاستثناء "RLMException" الذي لم يتم اكتشافه، السبب:"محاولة تعديل كائن خارج معاملة الكتابة - استدعاء BeginWritTransaction على مثيل RLMREALM أولاً." * أول رمي مكدس الاستدعاءات:(0x2f7b0f83 0x39f61ccf 0xc46ef 0xc3c23 0xc0c9d 0xb3e73 0x3a449833 .dylib:الإنهاء باستثناء لم يتم اكتشافه من النوع NSException

ويتم طرحها أثناء تنفيذ هذا الكود.

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    UITextField * alertTextField = [alertView textFieldAtIndex:0];
    if (![self.chatSession.theirAlias isEqualToString:alertTextField.text]) {
        self.sender = alertTextField.text;
        dispatch_queue_t queue = ((AppDelegate *)[UIApplication sharedApplication].delegate).queueForWrites;
        dispatch_async(queue, ^{
            [[RLMRealm defaultRealm] beginWriteTransaction];
            self.chatSession.myAlias = alertTextField.text; // This is the line where the error is thrown
            [[RLMRealm defaultRealm] commitWriteTransaction];
        });
    } else {
        [self promptForAliasAfterRejection];
    }
}

من الواضح جدًا أنني أكتب داخل معاملة كتابة.هل هذا خطأ في عالم؟أم هل فاتني شيء...؟

هل كانت مفيدة؟

المحلول

ال beginWriteTransaction و commitWriteTransaction يجب أن يتم استدعاؤها في نفس المجال الذي يوجد به الكائن الذي تقوم بتعديله.في كل مرة تتصل بها [RLMRealm defaultRealm], ، أنت تحصل على عالم جديد.لن يكون هذا هو نفس المجال الموجود فيه self.chatSession.لإصلاح هذه المشكلة، قم بتأكيد ذلك أولاً self.chatSessionعالم في نفس قائمة الانتظار مثل عالمك queueForWrites (أنا أفترض self.chatSession هو RLMObject, ، بالطبع).بعد ذلك، قم فقط بما يلي داخل الكتلة بدلاً من ذلك:

[self.chatSession.realm beginWriteTransaction];
self.chatSession.myAlias = alertTextField.text;
[self.chatSession.realm commitWriteTransaction];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top