CoreData 和 Swift 的 Actor 和 Sendable
CoreData and Swift's Actor and Sendable
我试图理解 Swift 的演员,但失败了。我正在玩下面的例子。
我想设置一个使用 NSPersistentContainer
.
的 LocalStore
struct LocalStore
应由声明为
的 StoreManager
使用
actor StoreManager {
private let localStore = LocalStore()
init() {
localStore.test()
}
}
LocalStore
声明为
import CoreData
import Foundation
struct LocalStore: Sendable {
private let localPersistentContainer = NSPersistentContainer()
func test() {
print("test")
}
}
这里我得到 2 个编译器错误,在此处显示为注释:
import CoreData // Add '@_predatesConcurrency' to suppress 'Sendable'-related warnings from module 'CoreData'
private let localPersistentContainer = NSPersistentContainer() // Stored property 'localPersistentContainer' of 'Sendable'-conforming struct 'LocalStore' has non-sendable type 'NSPersistentContainer'
我不知道从模块 'CoreData' 中抑制与 'Sendable' 相关的警告是否保存或是否可取,也不知道如何处理不可发送的类型 'NSPersistentContainer'.
欢迎任何帮助。
现在我对情况有了一些了解。
LocalStore
声明为 Sendable
,即应该可以在 thread-safe 周围传递。现在假设它的 属性 localPersistentContainer
声明如下:
let localPersistentContainer = NSPersistentContainer()
NSPersistentContainer
有一些可以设置的属性,比如 persistentStoreDescriptions
。因此,这样的 属性 可以在 LocalStore
内更改,也可以通过 LocalStore
传递给的任何内容进行更改,即这不会是 thread-safe。在这种情况下,警告
Stored property 'localPersistentContainer' of 'Sendable'-conforming struct 'LocalStore' has non-sendable type 'NSPersistentContainer'
有道理。
但是,在我的例子中 localPersistentContainer
声明如下:
private let localPersistentContainer = NSPersistentContainer()
这意味着任何接收到 LocalStore
的东西都不能访问私有的 属性 localPersistentContainer
,因此编译器警告是 not 合理的,因为编译器当然知道这一点。
正如其他编译器警告所建议的那样,
@_predatesConcurrency import CoreData
抑制 CoreData 模块创建的所有 Sendable
警告。虽然这有效,但在我看来它很危险,因为它也抑制了合理的警告。
我试图理解 Swift 的演员,但失败了。我正在玩下面的例子。
我想设置一个使用 NSPersistentContainer
.
的 LocalStore
struct LocalStore
应由声明为
StoreManager
使用
actor StoreManager {
private let localStore = LocalStore()
init() {
localStore.test()
}
}
LocalStore
声明为
import CoreData
import Foundation
struct LocalStore: Sendable {
private let localPersistentContainer = NSPersistentContainer()
func test() {
print("test")
}
}
这里我得到 2 个编译器错误,在此处显示为注释:
import CoreData // Add '@_predatesConcurrency' to suppress 'Sendable'-related warnings from module 'CoreData'
private let localPersistentContainer = NSPersistentContainer() // Stored property 'localPersistentContainer' of 'Sendable'-conforming struct 'LocalStore' has non-sendable type 'NSPersistentContainer'
我不知道从模块 'CoreData' 中抑制与 'Sendable' 相关的警告是否保存或是否可取,也不知道如何处理不可发送的类型 'NSPersistentContainer'.
欢迎任何帮助。
现在我对情况有了一些了解。
LocalStore
声明为 Sendable
,即应该可以在 thread-safe 周围传递。现在假设它的 属性 localPersistentContainer
声明如下:
let localPersistentContainer = NSPersistentContainer()
NSPersistentContainer
有一些可以设置的属性,比如 persistentStoreDescriptions
。因此,这样的 属性 可以在 LocalStore
内更改,也可以通过 LocalStore
传递给的任何内容进行更改,即这不会是 thread-safe。在这种情况下,警告
Stored property 'localPersistentContainer' of 'Sendable'-conforming struct 'LocalStore' has non-sendable type 'NSPersistentContainer'
有道理。
但是,在我的例子中 localPersistentContainer
声明如下:
private let localPersistentContainer = NSPersistentContainer()
这意味着任何接收到 LocalStore
的东西都不能访问私有的 属性 localPersistentContainer
,因此编译器警告是 not 合理的,因为编译器当然知道这一点。
正如其他编译器警告所建议的那样,
@_predatesConcurrency import CoreData
抑制 CoreData 模块创建的所有 Sendable
警告。虽然这有效,但在我看来它很危险,因为它也抑制了合理的警告。