Joe*_*hmo 1 core-data ios uimanageddocument
它在UIManagedDocument的文档中简要提到过
为了支持异步数据写入,Core Data实际上使用了一对嵌套的托管对象上下文.
特定于UIManagedDocument或Core Data是否始终如此?
同一份文件也指出了这一点
如果适用,您可以将后台线程中的数据直接加载到父上下文.
这是否意味着在以下代码中
NSManagedObjectContext *moc = self.managedObjectContext;
[moc performBlock:^() {
Record *record = [NSEntityDescription
insertNewObjectForEntityForName:@"Record"
inManagedObjectContext:moc];
}];
Run Code Online (Sandbox Code Playgroud)
我应该简单地替换第一行
NSManagedObjectContext *moc = self.managedObjectContext.parentContext;
Run Code Online (Sandbox Code Playgroud)
要做到这一点?
我想我也很困惑直接使用这个父上下文的"适当".我的意思是听起来像performBlock用于将任务卸载到后台队列.为什么我需要弄乱父上下文?
如果有人为我澄清这一切,我将不胜感激.
这是一个实现细节UIManagedDocument,但这是Core Data应用程序中的常见设计模式.所述managedObjectContext的UIManagedDocument是并发类型的上下文NSMainQueueConcurrencyType,而parentContext是并发类型的上下文NSPrivateQueueConcurrencyType.
有关并发类型的更多信息,请参见此处.简而言之,父上下文使用后台队列进行操作,而子进程使用主队列.
通常,当您希望在后台队列中以非阻塞方式执行某些操作时,您希望直接使用父上下文.例如,如果您希望执行长而难以获取的请求,则可以直接在父上下文中执行它.请记住,返回的对象在上下文之间是不可互换的,因此您必须将返回的对象从一个上下文重新绑定到另一个上下文中(但现在可以使用该方法轻松执行重新获取[NSPredicate predicateWithFormat:@"SELF IN %@", fetchedObjectsFromAnotherContext]).
总而言之,这取决于你在操作中做了什么.主队列上下文通过不要求您使用来简化了很多事情performBlock:,因为所有操作都在主队列(主线程)上执行.如果您只想插入一个对象,移动到专用队列的好处可以忽略不计,或者甚至由于操作系统的上下文切换而有害.但是,如果为了执行此对象插入,您需要执行繁重的工作,可以将其卸载到后台队列并直接在父上下文中执行.
| 归档时间: |
|
| 查看次数: |
865 次 |
| 最近记录: |