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 个编译器错误,在此处显示为注释:

我不知道从模块 '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 警告。虽然这有效,但在我看来它很危险,因为它也抑制了合理的警告。