Frage

Ich habe also keine Ahnung, warum ich diesen Fehler bekomme.Die Fehlermeldung lautet wie folgt:

* Beenden der App aufgrund einer nicht abgefangenen Ausnahme 'RLMException', Grund:'Versuch, ein Objekt außerhalb einer Schreibtransaktion zu ändern - rufen Sie zuerst beginWriteTransaction auf einer RLMRealm-Instanz auf.' * Aufruf-Stack für den ersten Wurf:(0x2f7b0f83 0x39f61ccf 0xc46ef 0xc3c23 0xc0c9d 0xb3e73 0x3a449833 0x3a449d 0x3a44a297 0x3a45c88d 0x3a45cb21 0x3a58bbd3 0x3a58ba98) libc++ abi.dylib:wird mit einer nicht abgefangenen Ausnahme vom Typ NSException beendet

Und wird beim Ausführen dieses Codes ausgelöst.

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

Es ist ziemlich klar, dass ich innerhalb einer Schreibtransaktion schreibe.Ist das ein Fehler mit Realm?Oder vermisse ich etwas...?

War es hilfreich?

Lösung

Der beginWriteTransaction und commitWriteTransaction sie müssen in demselben Bereich aufgerufen werden, in dem sich das Objekt befindet, das Sie ändern.Jedes Mal, wenn Sie anrufen [RLMRealm defaultRealm], du bekommst ein neues Reich.Dies wird nicht dasselbe Reich sein, in dem es sich befindet self.chatSession.Um dies zu beheben, bestätigen Sie dies zunächst self.chatSessionDas Realm befindet sich in derselben Warteschlange wie Ihr queueForWrites (Ich nehme an self.chatSession ist ein RLMObject, natürlich).Dann machen Sie stattdessen einfach Folgendes innerhalb des Blocks:

[self.chatSession.realm beginWriteTransaction];
self.chatSession.myAlias = alertTextField.text;
[self.chatSession.realm commitWriteTransaction];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top