2009-11-22 76 views
0

我在嘗試在線程NSOperation中執行一些核心數據操作時遇到了很多問題。如何正確使用核心數據進行多線程?

目前,我在我的應用程序委託中創建了一個託管對象上下文,它純粹用於我的線程NSOperations。我設置了一個最大併發數爲1的NSOperationQueue,因此每個操作都是連續執行的。對於每個操作(從互聯網獲取數據並創建新的託管對象),我將其傳遞給使用的上下文。一旦創建新對象,我將保存並重置上下文以供下一個要使用的操作。然而,我在做這件事的時候間歇性地得到了malloc錯誤,而且我花了好幾天的時間試圖弄清楚它,看起來似乎與它的線程有關。

我收到的錯誤可以在這個相關的stack overflow question中看到。

當我僅僅將被管理對象的屬性設置爲NSNumber對象時,就會發生malloc錯誤。這也是我第一次設置這個屬性,所以我無法釋放自己!我根本找不到它,而且我無法使用GuardMalloc重現錯誤,它只是不會發生!就好像錯誤正在其他地方發生,但我不知道在哪裏!

我可以推論的是,這個錯誤與我如何設置整個事物有某種聯繫。我嘗試過自己運行這個操作,而不是將它添加到NSOperationQueue,它似乎工作正常(雖然它掛起了主線程!)。

我還需要上下文來通知我的應用程序中的其他上下文已保存時,所以我觀察它的NSManagedObjectContextDidSaveNotification通知。但是,由於NSOperation(其他線程)正在執行保存,所以會出現問題,因爲通知只會在正在運行的線程上分派。

回答

0

對,我已經設法讓所有的工作現在,很多我的安慰。在經歷了幾天的混亂之後,我決定重寫所有使用線程和核心數據的代碼,並且我不再得到malloc錯誤。這是一個相當複雜的設置,所以在那裏肯定有一些非常模糊的東西!

2

您是否閱讀了核心數據編程指南的Multi-Threading with Core Data部分?

+0

是的,我已經讀過了,而且我正在根據它應該如何做所有事情。我爲這個線程使用了一個單獨的上下文(它甚至在隊列上只有一個'NSOperation'),我沒有在線程之間傳遞任何管理對象。那麼,我在我的應用程序委託中調用一個方法來返回一個對象,但方法的內部被封裝在一個@synchronized(self){}塊中,並且它返回的被管理對象位於線程的上下文中。 – 2009-11-22 18:26:10

2

復活一個老問題,但這可能有助於某人 - 我遇到了類似的問題,這裏描述了相同的設置(每個NSOperation的專用上下文,最大併發度爲1),並且我發現這是由於事實我在主線程上創建NSOperation專用的上下文,然後我嘗試在NSOperation線程中使用它。一旦我將上下文創建轉移到NSOperation的主要功能中,問題就沒有了。