我的iOS項目的一部分輪詢服務器的對象集,然後轉換並保存到核心數據,然後用結果更新UI。服務器任務發生在我稱爲'服務'的NSOperation類的集合中,後者在後臺運行。如果NSManagedObject
及其~Context
是線程安全的,我將不得不在服務調用主線程上的委託方法像這樣的:將存儲在後臺的一組Core數據對象傳遞給主線程的方式是什麼?
- (void)service:(NSOperation *)service retrievedObjects:(NSArray *)objects;
當然you can't pass around NSManagedObject
s這樣,所以這種委託方法是註定的。據我所見,有兩種解決方案可以從主線程獲取對象。但我都不喜歡,所以我希望偉大的StackOverflow社區能夠幫助我拿出第三名。
我可以在主線程上執行
NSFetchRequest
在新增加或修改的對象拉。問題是核心數據存儲包含更多這些對象,所以我必須添加相當多的冗餘來傳達正確的對象集合。一種方法是將一個屬性添加到像batchID
這樣的對象,然後我可以將其傳回給委託,以便知道要獲取什麼。但是,向商店添加數據以修復我的併發限制感覺不對。我也可以收集新添加的對象'
objectID
屬性,將它們放入列表中並將該列表發送給委託方法。不幸的是,我必須填充之後的列表我保存了上下文,這意味着在我擁有正確的列表(第一次是解析服務器響應時)之前,我必須在後臺循環兩次對象。然後,我仍然只有一個objectID
s的列表,我必須在主線程中使用中的existingObjectWithID:error:
個別捲入。這看起來很麻煩。
我錯過了哪些信息?第三個解決方案是從後臺線程將一組NSManagedObject
帶到主線程,而不會丟失線程限制?
我喜歡這個解決方案,謝謝!你實際上得到了「回答」的標誌,因爲它比我的更適合一般用途。謝謝@adonoho! – epologee