我有后台NSInvocationOperation创建NSArray并将其保存到NSManagedObject子类。
我知道保存应该在主线程上进行,所以我使用performSelectorOnMainThread在操作中进行保存。
当用户按iPhone 3G上的主页按钮时,应用程序将退出。在applicationDidEnterBackground中,我执行[queue waitUntilAllOperationsAreFinished],以便NSInvocationOperation有时间完成。
问题是,它仅等待操作的“背景部分”-在调用操作的performSelectorOnMainThread部分之前,应关闭应用程序。这意味着我的NSManagedObject未保存。
我试图将对象保存在操作的线程中-应用正常关闭并保存更改。但是我认为这不好,因为NSManagedObject不是线程安全的。还是可以这样做?
好像是陷阱22。我必须丢失一些东西-有什么优雅的方法来解决这个问题吗?
最佳答案
您应该只在后台使用通知主上下文的单独上下文进行保存操作。这意味着应在此单独的上下文中创建,获取和保存托管对象,这在Core Data - Concurrency with Core Data中进行了说明。您还应该启动background task以确保有足够的时间完成数据保存。
关于iphone - NSOperationQueue waitUntilAllOperationsAreFinished与performSelectorOnMainThread,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6781341/