自从iOS 5以来,我对CoreData新支持的并发功能感到很兴奋。
维护专用队列,并且可以通过该队列完成所有保存或获取请求。
但是,我可以为CoreData设置the private queue
,以便逐个执行请求吗?
我的应用正在从多个Feed中下载新闻。每次从一个Feed下载和解析完成后,我只需通过专用队列将Feed的项目保存到CoreData中。
但是,由于我同时从多个Feed下载和解析,因此我总是为CoreData提供多组项目,即multiple save requests
。
现在的情况是,我猜CoreData只有一些线程,每个线程都将一组项目保存到数据库中。我的UI在同一时间陷入困境。
你认为我可以控制私人队列,这样无论有多少同时保存请求,它们都会逐一完成吗?
答案 0 :(得分:3)
核心数据(可能)仅使用一个串行队列或线程。我最近使用我创建的串行队列(app为4.3)将我的应用程序转换为在iOS 5中使用这个新选项。在所有情况下,当你'performBlock'时,该方法以串行方式处理。此外,您现在可以从任何队列调用'[moc performBlocK:...]',因为该调用是线程安全的!
我相信你想要做的是让你的后台线程(最有可能添加选项)使用'performBlock:'(没有等待)。然后,您提供的块将以FIFO方式排队和处理。稍后,如果您的表想要获取对象,它可以发出'performBlockAndWait:',或者您的代码可以选择使用performBlock请求最新的对象,并在提供的块消息的末尾将消息返回给您的应用程序对象集你需要。
此外,我只是经常在开发版本中保存,以验证有效性。一旦你确定一切正常,你就可以在下载所有数据后执行后台保存。
EIDT:重申 - 如果您在加载viewController时正在下载并使用图像或其他数据,并且正在进行许多事情,那么这是最糟糕的时间进行保存。使用计时器或dispatch_after,并且在一切看起来稳定后的几秒钟然后执行保存。