Попытка изменить объект за пределами транзакции записи
Поэтому я понятия не имею, почему я получаю эту ошибку. Сообщение об ошибке выглядит следующим образом:
* Завершение приложения из-за неперехваченного исключения "RLMException", причина: "Попытка изменить объект за пределами транзакции записи - сначала вызовите beginWriteTransaction в экземпляре RLMRealm".
* Первый стек вызовов броска:
(0x2f7b0f83 0x39f61ccf 0xc46ef 0xc3c23 0xc0c9d 0xb3e73 0x3a449833 0x3a449ded 0x3a44a297 0x3a45c88d 0x3a45cb21 0x3a58bbd3 0x3a58ba98)
libС++ abi.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];
}
}
Довольно ясно, что я пишу внутри транзакции записи. Это ошибка в Realm? Или я что-то упускаю...?
Ответы
Ответ 1
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];