2013-07-11 45 views
0

我已经阅读了很多博客,推荐使用以下模式在多个线程中使用核心数据。我不得不使用NSFetchdResultsController来获取CoreData中的所有记录。因为它会在主线程(main moc)中运行,它会阻塞主线程吗?如果我想获取一些记录,我可以使用临时背景MOC来获取?以及如何做到这一点?做这个策略,使用多线程核心数据会阻塞主线程?

+0

如果主线程正在运行,那么是的,它会阻塞UI,但是您可以从bg线程的核心数据中获取结果。 – danypata

+0

如何在后台线程中获取结果并通知主moc? – NOrder

+0

在GCD中有很多关于此的教程,但是当您使用线程和CoreData时,必须非常小心ManagedObjectContext。基本上每个线程都有自己的托管对象上下文,并且您可以在后台线程上获取/处理数据,然后将结果发布到主线程上。 – danypata

回答

0

您通常在NSFetchedResultsController的获取请求上配置批处理。然后,当你在NSFetchedResultsController中执行提取操作时,它又执行提取请求,该请求非常小,因为它基本上只提取对象标识而没有提取数据。稍后,当访问结果中的某个对象(通常在-tableView:cellForRowAtIndexPath :)中时,将获取第一批次。这个提取也需要很少的时间(如果配置足够小的批量大小)。当您滚动并访问不在批处理中的第一个对象时,会提取下一批,等等。这样在主线程上不会执行大的提取。

此方法和您选择的模式存在一个问题。出于某种原因,在子上下文中执行获取请求时,批处理不起作用。它仅适用于直接连接到持久存储协调器的上下文。