2011-12-01 87 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创建的临时对象。

    相关问题