NSOperationQueue waitUntilAllOperationsAreFinished vs. performSelectorOnMainThread

时间:2011-07-21 19:07:04

标签: iphone objective-c ios core-data nsoperationqueue

我有背景 NSInvocationOperation 创建 NSArray 并将其保存到 NSManagedObject 子类。

我知道保存应该发生在主线程上,所以我使用 performSelectorOnMainThread 来保存操作。

当用户在iPhone 3G上按下主页按钮时,应用程序将退出。在 applicationDidEnterBackground 中,我执行 [queue waitUntilAllOperationsAreFinished] ,以便NSInvocationOperation有时间完成。

问题是,它只等待操作的“后台部分” - app在调用performSelectorOnMainThread部分操作之前被关闭。这意味着我的NSManagedObject未保存。

我试图在操作的线程中保存对象 - 应用程序正常关闭并保存更改。但我认为这并不好,因为NSManagedObject不是线程安全的。或者可以这样做吗?

看起来像是抓住了22.我必须遗漏一些东西 - 有什么优雅的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您应该使用通知主要上下文的单独上下文在后台执行保存操作。这意味着创建,获取和保存托管对象应该在这个单独的上下文中完成,这在Core Data - Concurrency with Core Data中有记录。您还应该启动background task以确保您有足够的时间来完成保存数据。