gpt4 book ai didi

swift - 我可以安全地将 NSManagedObject 传递给 performBackgroundTask 吗?

转载 作者:行者123 更新时间:2023-11-28 15:07:56 25 4
gpt4 key购买 nike

如主题中的问题。我有一组名为 reportNSManagedObject 子类。现在我想对这些数据做大量的计算。这可能需要一些时间,所以我不想阻塞主线程。

let persistentContainer = DatabaseStack.shared.persistentContainer
persistentContainer.performBackgroundTask { (context) in
//HERE: calculation on reports array
}

我是否应该使用给定的背景 contextperformBackgroundTask 中重新获取 reports 数组。哪种重新获取方法最好?你能举个例子吗?

编辑

我知道 NSManagedObject 不是线程安全的,但我在 iOS10 下开发并使用 performBackgroundTask 方法。不知那里的方法是不是没有处理

编辑2

我补充说现在一切正常(我没有重新获取对象)但我想确定这将始终正常工作而不会出现随机崩溃。

最佳答案

这仍然不安全。该文档在最新的文章中明确说明了这一点,描述了并发性和队列:

NSManagedObject instances are not intended to be passed between queues. Doing so can result in corruption of the data and termination of the application. When it is necessary to hand off a managed object reference from one queue to another, it must be done through NSManagedObjectID instances.

You retrieve the managed object ID of a managed object by calling the objectID method on the NSManagedObject instance.

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html (在底部)

使用诸如 perform 之类的方法假设您确实使用上下文实现了原子操作(例如,创建 MO 并保存它们或获取 MO 并提取数据以请求逻辑等)

关于swift - 我可以安全地将 NSManagedObject 传递给 performBackgroundTask 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48186892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com