2017-09-28 20 views
0

在閱讀開發者文檔時,我還沒有找到答案。使用全局受管對象上下文來支持併發

當使用主要和專用隊列上下文中Core Data是它使用的是我可以在我的應用程序和我的應用程序的整個生命週期進入全球NSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType環境好的呢?

或者,我應該每次創建新實例時需要使用NSManagedObjectContext?我已經使用this documentation但它不回答這個問題。

+0

兩者都很好。我有使用臨時背景環境的良好經驗,以及使用全局背景環境的糟糕經歷。上下文並不昂貴,你不應該害怕根據需要創建和銷燬它們。 –

回答

1

在大多數情況下,目前的最佳做法是從NSPersistentContainer開始。它的方法指向處理託管對象上下文的良好實踐。

NSPersistentContainer有一個屬性viewContext它使用主隊列併發性。顧名思義,它可以直接與用戶界面和主隊列配合使用。對於這些情況使用此上下文。不要創建新的主隊列上下文。

它也有一些方法可以通過newBackgroundContext()performBackgroundTask在專用隊列上進行後臺工作。在大多數情況下,當你需要做後臺工作時,你可以使用其中的任何一種,而不需要保留對長壽命背景上下文的引用。需要注意的是,由於它們使用不同的後臺隊列,因此一個後臺上下文有可能與另一個後臺上下文同時執行。如果在你的情況下這似乎是可能的,你可能想要堅持一個背景環境來避免這種可能性。否則,您的背景上下文可能需要合併對其他背景上下文進行的更改,這些背景上下文可能會變得很難看。

上述所有情況都有例外,但這是一個很好的起點。如果出於某種原因不適合您的應用程序,請回過頭再詳細說明原因。

+0

這是否是蘋果不再推薦的做背景核心數據的舊方法?我想要使​​用'NSPrivateQueueConcurrencyType'和'NSMainQueueConcurrencyType'。 –

+0

如果使用'newBackgroundContext()'或'performBackgroundTask',則使用私有隊列併發。 –

+0

啊,明白了。這在iOS 10中是全新的。 –

0

我會建議你在不同的上下文中編寫然後合併回去。

作爲一個良好的做法,我可以推薦使用設置MagicalRecord

具體而言,他們使用Default Context as a Child of a RootSavingContext。然後,所有寫入到new context,然後合併到根上下文中。

通過這種方式,可以在主線程中使用默認上下文並獲取適當的更新通知,例如,用於FetchedResultsController。

相關問題