MagicalRecord 2.0.3を使用していますが、バックグラウンドでデータを保存する方法がわかりません。
ドキュメントによると、このようなものが機能するはずです:
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {
// Do this hundreds of times
[MyObject createInContext:localContext];
}];
ただし、データベースには何も保存されません。私はこれに似た解決策を投稿している複数の人々を見てきました:
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {
// Do this hundreds of times
[MyObject createInContext:localContext];
} completion:^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[NSManagedObjectContext defaultContext] saveNestedContexts];
}];
}];
これにより、データベースにデータが保存されますが、保存はメインスレッドで行われるため、アプリケーションはしばらく応答しません(データセットでは、約3秒で長すぎます)。
私もこれを試しましたが、保存中にブロックされます:
self.queue = [[NSOperationQueue alloc] init];
[self.queue addOperationWithBlock:^{
NSManagedObjectContext *localContext = [NSManagedObjectContext contextForCurrentThread];
// Do this hundreds of times
[MyObject createInContext:localContext];
[localContext saveNestedContexts];
}];
そして最後に、このコードと同じブロッキング効果:
dispatch_queue_t syncQueue = dispatch_queue_create("Sync queue", NULL);
dispatch_async(syncQueue, ^{
NSManagedObjectContext *localContext = [NSManagedObjectContext contextForCurrentThread];
// Do this hundreds of times
[MyObject createInContext:localContext];
[[NSManagedObjectContext contextForCurrentThread] saveNestedContexts];
});
それで、これを解決するための最良の方法は何ですか?バックグラウンドで何百ものオブジェクトを作成する必要があり、アプリは応答性を維持する必要があります。