创建一个将返回managedObjectContext的当前实例的Core Data类方法是否可行且切实可行?我想知道这样我可以转到其他控制器并加载模态视图而无需传递managedObjectContext。
此外,如果我使用dispatch_async
核心数据,我知道我需要创建自己的managedObjectContext实例,但我可以使用相同的协调器。这是否可以在dispatch_async
和主线程中访问信息?
我基本上使用dispatch_async
从API获取数据并在用户使用应用程序时存储它。
答案 0 :(得分:1)
过去,我创建了一个简化了核心数据管理器的单例类。 Here is an example,但这是iOS5 / ARC之前的版本,因此需要进行一些更改。
答案 1 :(得分:0)
在尝试异步从我的服务器获取数据到应用程序时,我遇到了类似的问题。我的方法有点不同,但基本上就是这里(这是一个4.3项目,所以没有ARC):
以下方法在我的DataUpdater单例中。第一种方法是在app启动时调用的:
- (void) update { //download the updates on a new thread
[NSThread detachNewThreadSelector:@selector(updateThread)
toTarget:self withObject:nil];
}
它使用此选择器初始化一个线程,该选择器仅负责从API下载内容,然后将其传递回主线程以进行保存。
- (void) updateThread { //the actual update thread
//New thread, new auto-release pool
//(dunno if you need to do anything fancy for ARC)
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//...
//YOUR CODE TO DOWNLOAD (BUT *NOT* SAVE) DATA FROM THE SERVER
//DON'T CREATE ANY MANAGED OBJECTS HERE
//...
//Pass the data to the main thread to perform
//the commit to the Core Data Model
[self performSelectorOnMainThread:@selector(saveUpdate:)
withObject:data waitUntilDone:NO];
//kill the thread & the auto-release pool
[NSThread exit];
[pool release];
}
现在我们回到主线程,数据被添加到核心数据模型,然后保存上下文。
- (void) saveUpdate:(NSArray *) data {
//add the objects to your Core Data Model
//and save context
NSError * error = nil;
[[[CoreManager defaultCoreManager] CoreContext] save:&error];
if (error) {
[NSException raise:@"Unable to save data update"
format:@"Reason: %@", [error localizedDescription]];
} else {
[[NSNotificationCenter defaultCenter] postNotification:
[NSNotification notificationWithName:@"DONE" object:nil]];
}
}
答案 2 :(得分:0)
只处理问题的第一部分(你不应该问多个问题!)你不必传递托管对象上下文 - 大概是你 传递一个托管对象?在这种情况下,上下文可用作托管对象本身的属性 - .managedObjectContext
。