2013-07-11 77 views
0

我已經閱讀了很多博客,推薦使用以下模式在多個線程中使用核心數據。我不得不使用NSFetchdResultsController來獲取CoreData中的所有記錄。因爲它會在主線程(main moc)中運行,它會阻塞主線程嗎?如果我想獲取一些記錄,我可以使用臨時背景MOC來獲取?以及如何做到這一點?做這個策略,使用多線程核心數據會阻塞主線程?

+0

如果主線程正在運行,那麼是的,它會阻塞UI,但是您可以從bg線程的核心數據中獲取結果。 – danypata

+0

如何在後臺線程中獲取結果並通知主moc? – NOrder

+0

在GCD中有很多關於此的教程,但是當您使用線程和CoreData時,必須非常小心ManagedObjectContext。基本上每個線程都有自己的託管對象上下文,並且您可以在後臺線程上獲取/處理數據,然後將結果發佈到主線程上。 – danypata

回答

0

您通常在NSFetchedResultsController的獲取請求上配置批處理。然後,當你在NSFetchedResultsController中執行提取操作時,它又執行提取請求,該請求非常小,因爲它基本上只提取對象標識而沒有提取數據。稍後,當訪問結果中的某個對象(通常在-tableView:cellForRowAtIndexPath :)中時,將獲取第一批次。這個提取也需要很少的時間(如果配置足夠小的批量大小)。當您滾動並訪問不在批處理中的第一個對象時,會提取下一批,等等。這樣在主線程上不會執行大的提取。

此方法和您選擇的模式存在一個問題。出於某種原因,在子上下文中執行獲取請求時,批處理不起作用。它僅適用於直接連接到持久存儲協調器的上下文。