我在嘗試在線程NSOperation中執行一些核心數據操作時遇到了很多問題。如何正確使用核心數據進行多線程?
目前,我在我的應用程序委託中創建了一個託管對象上下文,它純粹用於我的線程NSOperations。我設置了一個最大併發數爲1的NSOperationQueue,因此每個操作都是連續執行的。對於每個操作(從互聯網獲取數據並創建新的託管對象),我將其傳遞給使用的上下文。一旦創建新對象,我將保存並重置上下文以供下一個要使用的操作。然而,我在做這件事的時候間歇性地得到了malloc錯誤,而且我花了好幾天的時間試圖弄清楚它,看起來似乎與它的線程有關。
我收到的錯誤可以在這個相關的stack overflow question中看到。
當我僅僅將被管理對象的屬性設置爲NSNumber
對象時,就會發生malloc錯誤。這也是我第一次設置這個屬性,所以我無法釋放自己!我根本找不到它,而且我無法使用GuardMalloc重現錯誤,它只是不會發生!就好像錯誤正在其他地方發生,但我不知道在哪裏!
我可以推論的是,這個錯誤與我如何設置整個事物有某種聯繫。我嘗試過自己運行這個操作,而不是將它添加到NSOperationQueue
,它似乎工作正常(雖然它掛起了主線程!)。
我還需要上下文來通知我的應用程序中的其他上下文已保存時,所以我觀察它的NSManagedObjectContextDidSaveNotification
通知。但是,由於NSOperation(其他線程)正在執行保存,所以會出現問題,因爲通知只會在正在運行的線程上分派。
是的,我已經讀過了,而且我正在根據它應該如何做所有事情。我爲這個線程使用了一個單獨的上下文(它甚至在隊列上只有一個'NSOperation'),我沒有在線程之間傳遞任何管理對象。那麼,我在我的應用程序委託中調用一個方法來返回一個對象,但方法的內部被封裝在一個@synchronized(self){}塊中,並且它返回的被管理對象位於線程的上下文中。 – 2009-11-22 18:26:10