我知道you can not register是对象或集合上的Realm .observe块,如果Realm在写事务中。

如果一切都在主线程上发生,这将更易于管理,但是我经常遇到此异常,因为我更喜欢将JSON解析交给后台线程。这很有效,因为我不必沉迷于主线程,并且如果我已经注册了监听那些更改,则可以使用Realm的漂亮通知系统来获得所有修改的通知。

现在,如果我要添加观察块,请检查以确保我的Realm不在这样的写事务中:

    guard let realm = try? Realm(), !realm.isInWriteTransaction else {
        return
    }

    self.myToken = myRealmObject.observe({ [weak self] (change) in
        //Do what ever
    }

这成功地防止了此异常。但是,除非我有一点创意,否则我永远不会有机会重新注册此 token 。
Realm团队是否有任何代码示例/建议,可以提供更好的模式来避免这种异常?我缺少成功注册 token 的任何技巧吗?

最佳答案

除了标准功能外,我确实使用Results的扩展名来避免这种情况。当我们的数据负载越来越大时,这个问题突然出现了。
尽管我们现在确实重写了观察函数逻辑,但是此扩展是一种临时解决方案,可避免最初发生崩溃的情况。
想法很简单:当前正在执行写事务时,请重试。

import Foundation
import RealmSwift

extension Results {
    public func safeObserve(on queue: DispatchQueue? = nil,
                            _ block: @escaping (RealmSwift.RealmCollectionChange<RealmSwift.Results<Element>>) -> Void)
    -> RealmSwift.NotificationToken {
        // If in Write transaction, call it again
        if self.realm?.isInWriteTransaction ?? false {
            DispatchQueue.global().sync {
                Thread.sleep(forTimeInterval: 0.1) // Better to have some delay than a crash, hm?
            }
            return safeObserve(on: queue, block)
        }
        // Aight, we can proceed to call Realms Observe function
        else {
            return self.observe(on: queue, block)
        }
    }
}
然后像这样称呼它
realmResult.safeObserve({ [weak self] (_: RealmCollectionChange<Results<AbaPOI>>) in
    // Do anything
})

关于swift - 在写事务中进行 Realm 通知注册,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47314253/

10-13 09:27