【发布时间】: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
标签: iphone ios multithreading core-data background