Попытка изменить объект вне транзакции записи

StackOverflow https://stackoverflow.com//questions/25051577

  •  21-12-2019
  •  | 
  •  

Вопрос

Поэтому я понятия не имею, почему я получаю эту ошибку.Сообщение об ошибке следующее:

* Закрытие приложения из-за неперехваченного исключения «RLMException», причина:«Попытка изменить объект за пределами транзакции записи - сначала вызовите начальную резакцию на экземпляре RLMRealm». * Стек вызовов первого броска:(0x2f7b0f83 0x39f61ccf 0xc46ef 0xc3c23 0xc0c9d 0xb3e73 0x3a449833 0x3a449de 0x3a44a297 0x3a45c88d 0x3a45cb21 0x3a58bbd3 0x588888. IB:завершение с неперехваченным исключением типа 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?Или я что-то упускаю...?

Это было полезно?

Решение

А 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