【问题标题】:Why do we need mainQueueConcurrencyType in Core Data?为什么我们在 Core Data 中需要 mainQueueConcurrencyType?
【发布时间】: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
    }
}

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    您可以使用私有队列并发做任何事情。您也几乎可以使用主队列并发来完成所有工作。它们是针对不同需求和编程风格的不同选项。你的方法会奏效,但这不是唯一的方法。

    托管对象不是线程安全的,因此如果您获取一个,您需要在获取它的同一线程上使用它。如果您打算在主队列上使用它——例如更新 UI——那么它必须在主队列上获取。主队列并发支持这一点。无论您是否使用NSFetchedResultsController,都是如此。

    如果您想编写一堆代码在托管对象和非托管对象或结构之间进行转换(例如,您的 DeskCoreDataDesk),那可能没有必要——如果您的非托管对象对象是线程安全的。 Core Data 不要求您这样做,因此由您决定是否接受额外的复杂性以避免主队列并发。

    【讨论】:

    • 我试图避免使用主队列并发,因为如果需要从 Core Data 获取大量数据,主线程可能会被阻塞。在这种情况下,有没有更好的解决方案?
    猜你喜欢
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2014-06-18
    • 2017-02-26
    • 2011-04-03
    • 2017-07-27
    • 2020-09-21
    相关资源
    最近更新 更多