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

Posted

技术标签:

【中文标题】核心数据和后台线程的问题【英文标题】:Issues with core data and background thread 【发布时间】:2011-12-30 13:55:10 【问题描述】:

新年快乐。

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

所以这是我的方法:

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

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

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

我曾尝试仅使用线程之间共享的一个 nsmanagedcontext,但这有时会导致其中一个线程停止并且不再继续。

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

问候

在帮助下解决: 我得到的错误是由于保存到我的持久存储时合并过程中的错误。我能够通过在保存时更改合并策略来解决它。下面的 sn-p 显示了我的 nsmanagedcontext 的 init 方法。其中粗体显示政策的设置。我可以这样做,因为我获取的数据是相同的,无论是主线程还是后台线程。

- (NSManagedObjectContext *)managedObjectContext

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

【问题讨论】:

与您的问题并不真正相关,但如果您将答案分成更小的块(垂直空白是您的朋友)可能包括代码 sn-ps(突出显示和颜色也很酷)等,它真的很有帮助. 当我点击你的问题时,我的第一个想法是“我没有阅读所有内容” 嗨,保罗,编辑删除了我的空格,我不知道我是否需要做点什么,因为我正在使用 chrome 或者我写帖子的时候可能只是因为我的问题让我很头疼:P 【参考方案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#/

【讨论】:

嗨,数据总是一样的,所以我会首先尝试这种方法,如果它解决了我的问题,请报告。 显然这似乎可以解决问题,我没有收到错误或任何奇怪的 chrashes。我会将我的新代码 sn-p 添加到帖子中。

以上是关于核心数据和后台线程的问题的主要内容,如果未能解决你的问题,请参考以下文章

在后台线程问题中将服务器数据保存到核心数据

删除核心数据对象并保存在后台线程中

从后台线程保存数据时核心数据崩溃

核心数据在后台线程上缓慢处理更新

在后台线程中将数据同步到服务器:核心数据中的多个上下文

延迟后在后台线程中处理核心数据