【发布时间】:2021-06-08 23:18:01
【问题描述】:
我是 Core Data 的新手,对创建 NSManagedObjectContext 时应该指定哪种并发队列类型感到困惑。我们什么时候想使用 mainQueueConcurrencyType?以下是 Apple 的记录方式:
私人队列 (NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType): 上下文创建并管理一个私有队列。
主队列 (NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType): 上下文与主队列相关联,因此与主队列相关联 应用程序的事件循环,但在其他方面类似于私有 基于队列的上下文。您将此队列类型用于链接到的上下文 只需要在 主线程。
我知道有一个 NSFetchedResultsController 可以与 UITableView 关联,但我不会使用这个控制器。谁能告诉我如何使用 mainQueueConcurrencyType 的示例?
根据我的理解,假设我们有一个名为 CoreDataDesk 的 NSManagedObject 子类,它将用于在屏幕上绘制桌面对象,如下所示:
class CoreDataDesk: NSManagedObject {
var color: UIColor?
}
class DeskView: UIView {
// Create a MOC with mainQueueConcurrencyType first.
// Then fetch a bunch of CoreDataDesk objects to initialize DeskView objects.
required init(desk: CoreDataDesk) {
self.backgroundColor = desk.color
super.init(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
}
}
这是使用主要并发类型上下文获取 CoreDataDesk 对象并使用它们绘制 UI 的正确示例吗?如果是这样,我认为我们可以使用私有并发类型上下文来获取 CoreDataDesk,然后我们初始化另一个 Desk 类(不是 NSManagedObject 子类),CoreDataDesk 仍在后台线程中。最后我们切换回主线程,使用Desk初始化DeskView,如下:
class CoreDataDesk: NSManagedObject {
var color: UIColor?
}
class Desk {
var color: UIColor?
init(coreDataDesk: CoreDataDesk) {
color = coreDataDesk.color
}
}
func fetchCoreDataDesk() {
// Create a MOC with privateQueueConcurrencyType first.
// Then fetch a bunch of CoreDataDesk objects.
DispatchQueue.main.async {
// convert each CoreDataDesk to Desk
}
}
【问题讨论】: