首页 > 解决方案 > 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")
        }
    }
}

提前致谢!

标签: iosswiftrealmios-multithreading

解决方案


推荐阅读