2

次の方法で、RestKit(0.10.0)とバックエンドのCoreDataを使用してサーバーから編集済みオブジェクトをロードしています。同期プロセスの一部としてのメソッドは、アプリがフォアグラウンドに入るたびに呼び出されます。

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

応答は正常にロードされ、キャッシュも見つかったようです。

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'

属性「street」の変更をテストすると、変更も適切にマップされます。

2012-04-11 15:58:33.013 mobileCRM[3575:1a03] T restkit.object_mapping:RKObjectMappingOperation.m:332 Mapped attribute value from keyPath 'street' to 'street'. Value: Musterweg 55

操作が終了した後、新しいfetchRequestを呼び出して、所属するテーブルビューをリロードしています。

問題

どういうわけか、変更されたオブジェクトは、最初の呼び出し後にバックエンドに保存されません(Core DataがCOMMITメッセージを表示している場合でも)。

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

しかし、もう一度アプリを開いてメソッドを再度呼び出すと、更新されたデータが期待どおりに表示されます。そのため、最初の呼び出しでメソッドを機能させるのに苦労しています。

あなたのアイデアをありがとう!

4

1 に答える 1

1

で出力を確認した後

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

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

CoreDataのデータのコミットが完了する前にデータをリロードすることに気づきました。

したがって、RKRequestQueueを使用している場合でも、次のメソッドを使用して問題を解決してください。

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

...そしてそれは機能します。:)

于 2012-04-12T10:17:48.860 に答える