Question

Je n'ai donc aucune idée de la raison pour laquelle j'obtiens cette erreur.Le message d'erreur est le suivant :

* Arrêt de l'application en raison d'une exception non interceptée 'RLMException', raison :«Tenter de modifier l'objet en dehors d'une transaction d'écriture - Appelez BeginWriteTransaction sur une instance RLMRealm en premier.» * Premier lancement de la pile d'appels :(0x2f7b0f83 0x39f61ccf 0xc46ef 0xc3c23 0xc0c9d 0xb3e73 0x3a449833 0x3a449ded 0x3a44a297 0x3a45c88d 0x3a45cb21 0x3a58bd3 0x3a58ba98) .Dylib:se terminant par une exception non interceptée de type NSException

Et est lancé lors de l'exécution de ce code.

- (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];
    }
}

Il est assez clair que j'écris dans une transaction d'écriture.Est-ce un bug avec Realm ?Ou est-ce que j'ai raté quelque chose... ?

Était-ce utile?

La solution

Le beginWriteTransaction et commitWriteTransaction doivent être appelés sur le même domaine dans lequel se trouve l'objet que vous modifiez.Chaque fois que tu appelles [RLMRealm defaultRealm], vous obtenez un nouveau royaume.Ce ne sera pas le même domaine que celui dans lequel self.chatSession.Pour résoudre ce problème, confirmez d'abord que self.chatSessionLe royaume de est dans la même file d'attente que votre queueForWrites (Je suppose self.chatSession est un RLMObject, bien sûr).Ensuite, faites simplement ce qui suit à l’intérieur du bloc :

[self.chatSession.realm beginWriteTransaction];
self.chatSession.myAlias = alertTextField.text;
[self.chatSession.realm commitWriteTransaction];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top