2012-04-11 11 views
2

Ich lade bearbeitete Objekte vom Server mit RestKit (0.10.0) und Core Data im Backend mit der folgenden Methode. Die Methode als Teil eines Synchronisierungsprozesses wird aufgerufen, sobald die App in den Vordergrund tritt.RestKit - Zwischenspeichern in Core-Daten nur beim zweiten Aufruf

[syncObjectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"?config=accounts&since=%@", lastSync] usingBlock:^(RKObjectLoader *loader) { 
    [loader.mappingProvider setObjectMapping:companyMappingSync forKeyPath:@"data"]; 
    loader.backgroundPolicy = RKRequestBackgroundPolicyContinue; 
    loader.delegate = self; 
}]; 

Die Antwort wird normal geladen und der Cache schien ebenfalls gefunden zu werden.

2012-04-11 15:58:32.147 mobileCRM[3575:707] T restkit.support:RKCache.m:82 Found cachePath '/var/mobile/Applications/C5E4BF4F-4CB0-4F4C-AC11-FC1E17AE4AF2/Library/Caches/RKClientRequestCache-www.URLTOSERVER.de/PermanentStore/37abc4aff62918578288d10530e6bcd6' for PermanentStore/37abc4aff62918578288d10530e6bcd6 
2012-04-11 15:58:32.152 mobileCRM[3575:707] T restkit.support:RKCache.m:119 Wrote cached data to path '/var/mobile/Applications/C5E4BF4F-4CB0-4F4C-AC11-FC1E17AE4AF2/Library/Caches/RKClientRequestCache-www.URLTOSERVER.de/PermanentStore/37abc4aff62918578288d10530e6bcd6' 
2012-04-11 15:58:32.158 mobileCRM[3575:707] T restkit.support:RKCache.m:100 Writing dictionary to cache key: 'PermanentStore/37abc4aff62918578288d10530e6bcd6.headers' 
2012-04-11 15:58:32.159 mobileCRM[3575:707] T restkit.support:RKCache.m:82 Found cachePath '/var/mobile/Applications/C5E4BF4F-4CB0-4F4C-AC11-FC1E17AE4AF2/Library/Caches/RKClientRequestCache-www.URLTOSERVER.de/PermanentStore/37abc4aff62918578288d10530e6bcd6.headers' for PermanentStore/37abc4aff62918578288d10530e6bcd6.headers 
2012-04-11 15:58:32.166 mobileCRM[3575:707] T restkit.support:RKCache.m:103 Wrote cached dictionary to cacheKey 'PermanentStore/37abc4aff62918578288d10530e6bcd6.headers' 

Beim Testen einer Änderung im Attribut "Straße" werden die Änderungen ebenfalls gut abgebildet.

Nach Abschluss der Operation rufe ich eine neue fetchRequest und neu die zugehörige Tabelle anzeigen.

Problem

Irgendwie hat das geänderte Objekt wird im Backend nicht gespeichert (auch mit Core Data zeigt die Meldung COMMIT) nach dem ersten Aufruf.

2012-04-11 16:05:44.235 mobileCRM[3603:351f] I restkit.core_data:RKInMemoryEntityCache.m:131 Caching all 2861 Company objectsIDs to thread local storage 
2012-04-11 16:05:44.354 mobileCRM[3603:351f] CoreData: sql: BEGIN EXCLUSIVE 
2012-04-11 16:05:44.357 mobileCRM[3603:351f] CoreData: sql: UPDATE ZCOMPANY SET ZSTREET = ?, Z_OPT = ? WHERE Z_PK = ? AND Z_OPT = ? 
2012-04-11 16:05:44.361 mobileCRM[3603:351f] CoreData: sql: COMMIT 

Aber wenn ich die App ein zweites Mal öffnen wieder die Methode aufzurufen, wird die aktualisierten Daten wie erwartet gezeigt. Ich kämpfe darum, dass die Methode beim ersten Aufruf funktioniert.

Vielen Dank für Ihre Ideen!

Antwort

1

Nach Überprüfung der Ausgabe mit

// App Delegate 
RKLogConfigureByName("RestKit/*", RKLogLevelTrace); 

// Scheme 
-com.apple.CoreData.SQLDebug 1 

Ich habe gemerkt, dass ich die Daten vor dem Festschreiben der Daten in Core Data ist abgeschlossen nachladen.

So beheben Sie das Problem mithilfe der folgenden Methode, auch wenn ich die RKRequestQueue verwenden.

- (void)objectLoaderDidFinishLoading:(RKObjectLoader *)objectLoader 
{ 
    // Send notification to tableView 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTableView" object:self]; 
} 

... und es funktioniert. :)

+0

In Übereinstimmung mit dem Frage/Antwort-Schema sollten Sie Ihre Lösung als Antwort veröffentlichen und akzeptieren. Dies hilft anderen Benutzern zu sehen, dass dies eine gelöste Frage ist und um die Antwort zu finden. – Kai

+0

Wird es für das nächste Mal erinnern, danke! – flashfabrixx