ios - Swift 后台线程上来自 Realm 的不一致状态
问题描述
尽管使用自动释放池并在每次访问领域时实例化一个新领域实例,但有时我会得到不一致的状态。
在以下(人为的)示例中,只有一个MyObject
存储在数据库中。删除后,第二个查询仍然看到该实例。任何人都可以阐明为什么会这样吗?它在大多数情况下都有效,但在极少数情况下我会出现不一致的状态。有时在两个单独的线程上访问领域时会发生这种情况,但它曾经发生在同一个线程上。
我知道我可能可以realm.refresh()
在第二个查询之前打电话(我没有测试过),但我的问题是我为什么需要这样做?每个函数都有自己的领域实例,并根据文档推荐包装在 autoreleasepool 中。我是不是误会了什么?
func start() {
DispatchQueue.global().async {
update1()
update2()
}
}
func update1() {
autoreleasepool {
let realm = try! Realm()
let object = realm.objects(MyObject.self).first! // expecting object here
try! realm.write {
realm.delete(object)
}
}
}
func update2() {
autoreleasepool {
let realm = try! Realm()
if let object = realm.objects(MyObject.self).first {
fatalError("not expecting object here")
}
}
}
提前致谢!
解决方案
推荐阅读
- apache-spark - 无法解析字段名称中的列名称
- angular6 - 以 Angular 6 反应形式预填充和验证日期
- apache-spark - spark streaming DStream map vs foreachRDD,转换效率更高
- c# - 在 Http 请求中设置标头
- amazon-web-services - 本地执行时出现内部服务器错误
- java - 关于访问孩子的变量或方法
- javascript - 如何使用 HTML/CSS/JS 在同一行中编写带有两个复选框的文本列表
- mysql - 具有root密码的Kubernetes mysql statefulset
- reactjs - 我是否需要在唯一更改的属性上设置状态?
- python - Python 处理请求参数?