私のアプリケーションでは、コアデータストアからかなりのオブジェクトを取得しています。これにより、アプリケーションがフリーズし、すべてのUI入力がブロックされます。私はバックグラウンドでは、アプリケーションが応答している間に、データが利用可能なときにtableview
を更新しながらフェッチをしたいと思います。
新しいNSManagedObjectContext
をNSPrivateQueueConcurrencyType
に設定し、それをメインMOCの子として作成しました。私の設定は、すべての処理がまだUIをフリーズしているように、すべてのメインキューで起こっていた古いコードとの応答性にほとんど違いがないように、私は希望のオブジェクトを返す間、コアデータのバックグラウンド処理がまだブロックされています。
これによると、子コンテキスト設定はUIの応答性を維持するのに役立ちませんが、これを読んでいるネットのどこにいても、メインキューを大量の処理から解放したい場合は移動する方法です。何か不足していますか?
NSManagedObjectContext *mainMOC = self.mainObjectContext;
NSManagedObjectContext *backgroundMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[backgroundMOC setParentContext:mainMOC];
[backgroundMOC performBlock:^{
//query for objects
NSArray *results = [Product MR_findAllInContext:backgroundMOC];
NSError *childError = nil;
[backgroundMOC save:&childError];
if ([results count] > 0) {
//get objectIDs
NSMutableArray *objectIDs = [NSMutableArray array]
for (NSManagedObject *object in results) {
[objectIDs addObject:[object objectID]];
}
[mainMOC performBlock:^{
//refetch objects on the mainQueue
NSMutableArray *persons = [NSMutableArray array]
for (NSManagedObjectID *objectID in objectIDs) {
[persons addObject:(Person*)[mainMOC objectWithID:objectID]];
}
//return result
if (self.callBack)
self.callBack(persons);
}];
}
}];
WWDC 2013のビデオ「コアデータのパフォーマンスの最適化とデバッグ」で、このことについて話し合うことをお勧めします。 –
この場合、主なコンテキストがNSFetchedResutsControllerによってサポートされているUIを凍結するネストされたコンテキストについて、iOS 5にバグがありました。この[Core Dataのネストされた管理オブジェクトコンテキストと頻繁なデッドロックフリーズ](http ://stackoverflow.com/questions/11786436/core-data-nested-managed-object-contexts-and-frequent-deadlocks-freezes) – Leonardo
あなたのコードが子コンテキストを使用してメインスレッド上で呼び出され、performBlockが役に立たない場合あなたの貼り付けられたコードがメインスレッド –