【发布时间】:2012-09-16 04:16:41
【问题描述】:
我正在使用 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];
});
那么,解决这个问题的最佳方法是什么?我需要在后台创建数百个对象,并且应用需要保持响应。
【问题讨论】:
-
新的嵌套上下文已经开始对 MagicalRecord 中的许多保存 API 造成严重破坏。虽然我知道这些问题,并且现在正在讨论一些修复,但我总是愿意接受建议。
-
也许你最好在没有像 MR 这样的框架的情况下使用 Core Data?
-
您是否曾使用 MagicalRecord 找到解决方案?我有同样的问题(在后台更新时 UI 锁定),我找不到解决方案。谢谢!
-
最后我从我的应用程序中删除了 MagicalRecord。我现在使用github.com/jksk/NLCoreData,它的魔力少了很多,而且效果似乎好多了。
-
MagicalRecord 2.1 表现更好吗?后台保存现在真的有效吗?
标签: ios multithreading core-data magicalrecord