2011-12-01 46 views
0

我想簡言之就是:CoreData在一個單一的獨立的線程

,沒有

我堵在主線程

  • 實體關係
  • 綁定InterfaceBuilder下
  • 運行
    • 核心數據已經嘗試過「一切」,但事實證明Core Data在兩個或更多線程和兩個NSManagedObjectContexts以及具有關係的綁定和實體等方面存在太多困難。這些線程可能會使CoreData非常複雜。

      不過,我想使用核心數據,我希望它在後臺運行,以獲得良好的UI響應。

      所以我想知道,是否有可能在一個單獨的線程中完成與核心數據相關的所有操作,這不是主線程?

      我會送大家50塊錢,如果我終於找到一個可行的解決方案......

    +0

    我可以建議看到[的NSOperation(http://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation_class/) – beryllium

    +0

    不能完全確定,但任何UI相關的(因此綁定Interface Builder)應該位於主線程iirc中。所以要做好至少一些線程間通信的準備。 – Monolo

    +0

    @Monolo:我知道,我會在這裏。 :( – Daniel

    回答

    1

    我用兩個NSManagedObjectContext實例將一些持續時間更長的數據任務推送到另一個帶有Grand Central Dispatch的線程上。

    只要您小心地將此上下文與用於提取數據的主線程上的內容合併,那麼您應該可以通過這種方式獲得某些性能。

    +0

    經過兩個小時的閱讀,這似乎是唯一的選擇,現在我要做的是從頭開始創建一個小測試應用程序,我將爲即將出現的困難提出一個新問題... – Daniel

    +1

    好的我很高興幫助 – Daniel

    +0

    這是我的第一個問題:http://stackoverflow.com/questions/8346455/how-to-set-a-relationship-to-a-from-one-nsmanageobject-to-another-in-a - 不同:) – Daniel

    0

    我不知道這是否可以幫助你,但也許你可以創建一個新的NSOperationQueue和添加任何核心數據功能你需要在後臺。所以在你的類中有一個屬性是NSOperationQueue,然後在-viewDidLoad方法中,你創建一個新的: myOperationQueue = [NSOperationQueue new];每當你想做一個操作,你可以將它添加到隊列中,我相信它會在一個單獨的線程上執行(self.myOperationQueue addOperation:someFunction),如果你想與主線程交互,然後調用assert([NSThread isMainThread])在你的方法調用的開始。我以不同的方式使用Core Data和線程,但是從第二個線程我可以創建NSManagedObject創建的臨時對象。

    相關問題