我正在使用 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];
});
那么,解决这个问题的最佳方法是什么?我需要在后台创建数百个对象,并且应用程序需要保持响应。