【发布时间】:2013-12-04 13:22:23
【问题描述】:
我在我的应用程序中使用 Magical Record 来解析服务器响应以生成/更新/删除我的数据模型对象,并使用它来获取我在应用程序中需要的所有数据。
对于导入,我有自己的抽象类,它有两种方法。 我也可以用这种方式替换 MagicalRecord 以非常容易地导入。
- (void)importInBackgroundUsingBlock:(void (^)(NSManagedObjectContext *localContext))block completion:(void (^)(BOOL success))completion
和
- (void)saveInBackgroundUsingBlock:(void (^)(NSManagedObjectContext *localContext))block completion:(void (^)(BOOL success))completion
importInBackground 用于我通过 API 获得的所有数据。就我而言,这些调用都是在 AFNetworking 请求之后进行的。 每当用户与应用程序交互时都会使用 saveInBackground,以便需要在数据库中更改某些内容。第二种方法是为了让我可以优先考虑用户造成的事情(因为他想要立即得到反馈)。
在我的抽象类中,我还有两个串行队列(每个方法一个),因此我有两个不同的后台线程。
这些方法现在看起来像这样......
- (void)saveInBackgroundUsingBlock:(void (^)(NSManagedObjectContext *localContext))block completion:(void (^)())completion
{
dispatch_async(self.backgroundQueue, ^{
[MagicalRecord saveUsingCurrentThreadContextWithBlockAndWait:block];
dispatch_async(dispatch_get_main_queue(), ^{
if (completion)
{
completion();
}
});
});
}
现在的问题是,如果我查看 Instruments 中的应用程序,我会发现很多时间(用于保存)都花在了主线程上。 另外 saveInBackground 经常要等待导入完成,我不太明白...
好像
- (void)MR_saveWithOptions:(MRSaveContextOptions)mask completion:(MRSaveCompletionHandler)completion;
在主线程上调用以保存上下文的父级。这似乎是主要背景。但是为什么保存发生变化的原始上下文很快,但保存主要上下文却要花这么长时间?!?我知道必须合并更改...但是它比原始保存花费的时间要长得多?!?
我可以有一个单独的上下文来保存到光盘吗?这对我有帮助吗?
如果你们能帮助我改进我的代码,那就太好了。
【问题讨论】:
标签: ios multithreading core-data magicalrecord