新しいバージョンのRestKitと複数のMOCを使用したのはこれが初めてなので、これは少し困惑しました。私はRestKit 0.20-pre5を使用しており、アプリケーション全体でRestKit操作と手動で管理対象オブジェクトを追加しています。
RestKits は、パフォーマンスを管理するために、mainQueue および PersistantStore オブジェクト コンテキストの 2 つの MOC を提供します。RestKits コードを検査すると、すべての新しい管理対象オブジェクトが mainQueue MOC に保存されます (RKObjectManager 行 433 とさまざまなポインター アドレスの検査に基づきます)。RestKit によって作成されたオブジェクトは正常に永続化されますが (もちろん、save を呼び出した後)、同じ mainQueue MOC で独自の ManagedObjects を作成して保存すると、アプリケーションを再起動しても永続化されません。(私は関連する MOC を頻繁に保存します)
ここで永続ストアの出番です。永続ストアを mainQueue MOC と共に保存すると、データは永続化されます。これは、(通知を介して)persistantStoreMOCでsaveを呼び出すたびに、RKManagedObjectStoreのマージ変更と関係があると思います。
問題は、両方のコンテキストを保存するたびに、少なくとも 1 秒続く顕著な遅延があることです (最大 3 秒まで変化する可能性があります!)。この遅延は、作成する NSManagedObjects が増えるほど増加するようです。計測器を実行しましたが、メモリの問題はありません。コア データの RestKits 実装を間違って使用しているに違いありません。
レコードについては、次の方法を使用して保存しています。
- (void)saveContext
{
__block BOOL _blockSuccess;
__block NSError *_blockError;
NSManagedObjectContext *persistantContext = [[[RKObjectManager sharedManager] managedObjectStore] persistentStoreManagedObjectContext];
[globalManagedObjectContext performBlockAndWait:^{
_blockSuccess = [globalManagedObjectContext save:&_blockError];
}];
if (! _blockSuccess) NSLog(@"Failed to save context: %@", _blockError);
[persistantContext performBlock:^{
_blockSuccess = [persistantContext save:&_blockError];
if (! _blockSuccess) NSLog(@"Failed to save context: %@", _blockError);
}];
}
これは、アプリケーションの状態を保存したいときはいつでもシングルトン オブジェクトから呼び出されます。(globalManagedObjectContext は、RestKits mainQueueObjectContext を指す単なるマクロです)。persistantContext の保存を削除すると、ラグが削除されますが、もちろんデータは保持されません。
誰でも助けてくれます(特にBlake Watters ;)大歓迎です!
乾杯、
アロン