Bry*_*yan 5 cocoa core-data objective-c nsmanagedobject nsmanagedobjectcontext
我知道Core Data不是线程安全的,并且与上下文关联的NSManagedObjectContext和NSManagedObjects不能从线程传递给线程.
但是,如果我的主线程上有NSManagedObjectContext,我可以在后台线程上创建一个NSManagedObject对象(没有将它附加到任何上下文 - 也就是说,只需在NSManagedObject上调用alloc/init),然后将该NSManagedObject传递回主线程并将其添加到上下文中?我已经查看了有关Core Data并发性的文档,但找不到任何说这种使用模式没问题的文档.
我有一个后台线程执行复杂的任务然后发布结果.结果是一个NSManagedObject子类,它包含一些属性:time,文件路径和成功或错误消息(作为字符串).我想在后台线程上创建结果对象,然后将其抛回主线程并将其添加到Core Data上下文中,它将在tableView中显示.
如果我无法在后台线程上创建managedObject,那么我需要创建一个字典,将字典传递给主线程,读取键,从这些值创建managedObject等等.如果可能的话,在后台线程上使用managedObject.
更好的方法是每个线程都有一个上下文.这样每个线程都有自己的便笺本可以玩.然后,当后台线程完成时,告诉主线程更新其视图或ui表视图或每个人如何呈现数据.
发生更改时,您需要通知主线程.最大的问题是,不同线程和主线程之间的上下文彼此不了解.核心数据中有一种方法可以使上下文保持同步.如果要保存,后台线程上的上下文应该广播NSManagedObjectContextDidSaveNotification通知.
例如,在您的NSOperation中的main方法中,您可以这样做:
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:context];
Run Code Online (Sandbox Code Playgroud)
mergeChanges将是您的NSOperation实例中的私有方法.
合并更改的示例
- (void)mergeChanges:(NSNotification *)notification
{
ApplicationController *appController = [[NSApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = [appController managedObjectContext];
// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1518 次 |
| 最近记录: |