核心数据和后台线程的问题

时间:2011-12-30 13:55:11

标签: iphone ios multithreading core-data background

新年快乐。

我正在使用应用程序,使用核心数据保存数据。该应用程序包含一个日历模块,允许用户通过两个按钮(nextDay,previousDay)在日期之间来回跳过。每天都包含我从网络服务中获取的som信息,因此我想在用户使用日历时在后台获取大部分数据(接下来的14天)。

所以这是我的方法:

第一天的数据由主线程获取并保存到持久存储并呈现给用户。然后在后台启动NSThread,使用新的nsmanagedcontext获取数据,并在获取所有数据时将其保存到持久存储中。

然而,当后台线程正在运行时,用户可以选择跳到第二天或前一天,如果没有数据,主线程将获取数据并将其保存到持久存储。这提供了两个线程获取相同数据并将其保存到持久存储的可能性。但正如我所理解的那样,这种方法应该不是问题,因为我为后台线程使用了新的nsmanangedcontext。

但有时我会收到以下错误操作无法完成。 (Cocoa错误133020。)然后主线程无法保存到持久存储。

我尝试过只使用一个在线程之间共享的nsmanagedcontext,但这有时会导致其中一个线程停止并且永远不会继续前进。

我花了很多时间阅读不同的论坛/博客,希望任何人都可以帮助或指导我朝着正确的方向前进。

问候

解决方案: 我得到的错误是由于保存到我的持久存储时合并期间的错误。我能够通过在保存时更改合并策略来解决它。以下代码段显示了我的nsmanagedcontext初始化方法。粗体显示政策的设定。我可以这样做,因为我提取的数据是相同的,无论它是主线程还是后台线程。

- (NSManagedObjectContext *)managedObjectContext
{
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
          **[__managedObjectContext setMergePolicy:NSOverwriteMergePolicy];**
    }
    return __managedObjectContext;
}

1 个答案:

答案 0 :(得分:1)

根据http://developer.apple.com/library/ios/#documentation/cocoa/Reference/CoreDataFramework/Miscellaneous/CoreData_Constants/Reference/reference.html,您的错误代码代表 NSManagedObjectMergeError

由于你总是获取相同的数据,我认为无论你是从后台线程还是你的主线程获得它都应该是相同的,所以你应该能够从它的默认 NSErrorMergePolicy更改你的合并策略 NSOverwriteMergePolicy ,它会用新数据覆盖任何冲突的对象(同样,假设它们是相同的,这不会有问题)。

您可以在此处找到有关合并政策的更多信息:http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSMergePolicy_Class/Reference/Reference.html#/