簡體   English   中英

在NSPrivateQueueConcurrencyType父上下文中使用NSPrivateQueueConcurrencyType子上下文

[英]Using NSPrivateQueueConcurrencyType child context with NSPrivateQueueConcurrencyType parent context

我在使用子上下文作為NSPrivateQueueConcurrencyType的暫存區時遇到問題。

我的核心數據堆棧如下所示: 核心數據堆棧

視圖控制器使用主上下文。 Worker Context用於從API導入數據。 我正在使用mergeChangesFromContextDidSaveNotification來合並Main和Worker上下文之間的更改。 如果我將工人孩子的背景置於等式之外,事情似乎正常。

但是,我想在導入對象時使用worker子上下文作為便箋簿。 一些數據需要構建嵌套對象,如果構建過程中某處出現錯誤,我想拋棄那個上下文。 如果構建成功,我希望能夠保存工作者子上下文,讓它將更改推送到工作者上下文,然后可以將更改保存並合並到主上下文。

但是,當我嘗試在Worker子上下文中執行獲取請求來執行查找或創建時,即使它是在Worker子上下文的performBlock內完成的,我也會得到一個多線程斷言。

我不確定哪些代碼片段有助於回答這個問題,但我主要擔心的是我的整體方法不會起作用。 將私有隊列上下文作為另一個上下文的子項是個壞主意嗎?

編輯:

我遇到的崩潰是工作者子上下文嘗試執行獲取請求以執行查找或創建操作。 它沒有在謂詞中使用任何托管對象,它包含在performBlockAndWait 我得到的解釋是'NSInternalInconsistencyException',原因:'語句仍處於活動狀態'崩潰是間歇性的,但到目前為止它似乎只有在我有嵌套的工作者子上下文時才會發生。 (即我的圖中的worker子上下文將具有自己創建對象的子上下文)

導致崩潰的獲取請求始終用於查找或創建操作,因此它嘗試獲取具有與要導入的對象的標識符匹配的唯一標識符屬性的任何對象。 所以謂詞總是像"identifier in ["1234", "abc", "etc" ]

正如我在評論中提到的,我最初使用的是PSC - >私有上下文 - >主要上下文 - >私有工作者上下文設置。 我在導入數據時工作者上下文獲取和保存時遇到UI凍結,所以我試圖重構這個堆棧以釋放UI。

顯示您的提取及其謂詞將有助於確定發生了什么。 聽起來你是跨越線程邊界訪問NSManagedObject ,也許在你的謂詞中使用一個?

順便說一句,如果您將工作人員移到主隊列下,則無需處理消費通知。 其他所有內容都完全相同,但您可以處理更少的代碼,減少線程問題的風險。

我最初在我的主要隊列下有工人。 PSC - >私人隊列 - >主要隊列 - >私人工作者。 我正在重構我正在詢問的設置,因為我遇到了UI被阻止而工作者上下文正在獲取/保存以查找或創建導入。 除了重構核心數據堆棧之外,還有其他方法來優化性能嗎?

您是否運行過儀器以確定該塊來自兒童MOC? 在每種情況下,我都聽說過這個問題,我發現它是其他東西(通常是UI相關的),這是問題的實際來源。 除非你針對一個壞的謂詞獲取數千個對象,否則你不應該感覺到一個獲取的命中。 即使這樣,謂詞也會被優化以解決問題。

至於保存,您可以A)增加保存頻率或B)設置私有MOC作為磁盤寫入器。 我更喜歡B,所以保證所有保存都是異步的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM