提问人:ambassador 提问时间:10/9/2023 更新时间:10/9/2023 访问量:109
如何使领域对象可发送?
How to make realm objects Sendable?
问:
TLDR:Realm 引入了 actor 隔离的领域,但领域对象不是 .那么,应该如何使用这些参与者孤立的领域呢?或者如何使我的对象可发送?Sendable
Realm 最近引入了 actor 隔离领域,我们正在将它与管理应用程序中的数据持久性一起使用,因为许多不同的地方需要触发写入/读取数据。@globalActor
当将此 actor 与任何正在传递的领域对象一起使用时,会弹出警告:
将不可发送类型“any Message”的参数传递到全局参与者“RealmBackgroundActor”隔离的上下文中可能会引入数据争用
我想这是由于我们的领域对象的实现不可发送:Message
class Message: Object, ObjectKeyIdentifiable, Codable {
@Persisted(primaryKey: true) var _id: String
@Persisted var senderUserName: String?
@Persisted var text: String
convenience init(_id: String = UUID().uuidString, senderUserName: String, text: String) {
self.init()
self._id = _id
self.senderUserName = senderUserName
self.text = text
}
}
但我做不到,因为:Sendable
“Sendable”类“Message”不能从“NSObject”以外的其他类继承
如何向该参与者传递数据或从该参与者传递数据?我想实际使用在Actor内部和Actor外部读取的领域数据是很常见的,例如用于更新UI。或者将外部对象传递给执行者以执行写入。
旁注:我非常不确定我是否使用了预期的方式,但我不知道还有什么办法可以确保没有与领域数据进行数据竞争,而不必在任何地方手动注入/管理一些领域参与者。@globalActor
我的想法是为每个领域对象创建一个可发送的 swift 对象,仅在 actor 内部与领域对象之间转换,但这似乎不是很干净。
我们实施的:@globalActor
@globalActor
actor RealmBackgroundActor {
static var shared = RealmBackgroundActor()
}
@RealmBackgroundActor
class PersistanceService: NSObject {
static let shared: PersistanceService = PersistanceService()
var realm: Realm?
func setupRealm() async {
realm = try? await Realm(actor: RealmBackgroundActor.shared)
}
func write(object: Object) {
do {
try realm.write {
realm.add(object, update: .modified)
}
} catch {
fatalError(error.localizedDescription)
}
}
}
并像这样调用这个 actor 之外的 write 函数:
await PersistanceService.shared.write(object: object)
答: 暂无答案
评论