CoreData - 如何使用 NSPrivateQueueConcurrencyType 使用临时上下文执行 NSFetchRequest?

Posted

技术标签:

【中文标题】CoreData - 如何使用 NSPrivateQueueConcurrencyType 使用临时上下文执行 NSFetchRequest?【英文标题】:CoreData - How to do NSFetchRequest with temporary context with NSPrivateQueueConcurrencyType? 【发布时间】:2012-09-11 23:07:43 【问题描述】:

ios 5 开始,CoreData 引入了自己的 private queue,您可以在其中让一些操作 (especially save context) 在后台运行。

这必须通过[context performBlock:...] 完成。

saving the context 很容易很好。但是,NSFetchRequest 怎么样?我的意思是如果我想获取一些东西并希望在后台获取呢?我不认为 [context performBlock..] 可以做到这一点。

还有新的方法吗?

【问题讨论】:

【参考方案1】:

任何涉及NSPrivateQueueConcurrencyTypeNSManagedObjectContext 的内容都应包含在performBlock 块中。对于后台获取,您希望将托管对象传回主队列的上下文,如下所示:(请注意,这仅用于说明目的):

// assume self.managedObjectContext is a main queue context
NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[backgroundContext performBlock:^
    // do your fetch - e.g. executeFetchRequest
    NSManagedObjectID *objID = [someManagedObject objectID];
    [self.managedObjectContext performBlock:^
        NSManagedObject *mainManagedObject = [self.managedObjectContext objectWithID:objID];
        //  do something now with this managed object in the main context
    ];
];

【讨论】:

谢谢。如果我想在后台获取一个 nsresultscontroller 并让主 UI 使用它怎么办?

以上是关于CoreData - 如何使用 NSPrivateQueueConcurrencyType 使用临时上下文执行 NSFetchRequest?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData - 如何使用 NSPrivateQueueConcurrencyType 使用临时上下文执行 NSFetchRequest?

如何使用 Swift 删除 coredata 中的特定记录?

如何使用 Swift3 访问 CoreData 中的数据索引

如何开始使用 SQLite、iCloud 和 CoreData?

如何在 SwiftUI 中使用 CoreData 更改数据值?

如何一起使用Codable和Coredata?