محاولة تعديل كائن خارج معاملة الكتابة
-
21-12-2019 - |
سؤال
لذلك ليس لدي أي فكرة عن سبب ظهور هذا الخطأ.رسالة الخطأ هي كما يلي:
* إنهاء التطبيق بسبب الاستثناء "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];