不同线程(闭包)中的RealmSwift更新对象

时间:2017-02-02 14:16:15

标签: swift3 realm

请帮助添加/更新Real对象 我喜欢存储和更新User类。 用户类由Client类组成, 客户端类包含Avatar属性和Rooms List。 问题是我面临错误"领域已经处于写入事务中#34;因为我的客户端类头像属性和房间列表被同时提取并推送到Realm的不同闭包中。

func fetchRooms() {
    roomsDelegate?.contactRooms(entityID: entityID,
                                success: {rooms in
                                    self.addRooms(rooms: rooms)
                                },
                                fail: { error in
                                    print (error)
                                })

}

func addRooms(rooms: [VMRoom]?) {
    if let r = rooms {
        do{
            try realm?.write {
                realm?.add(r, update: true)
                self.rooms.append(objectsIn: r)
            } }
        catch let e {
            print(e.localizedDescription)
        }
    }
}


func getAvatarURL() {
    do{
        try realm?.write {
            avatarURL = avatarDelegate?.contactAvatarURL(eExtention: eExtention)                
        } }
    catch let e {
        print(e.localizedDescription)
    }
}

1 个答案:

答案 0 :(得分:0)

就像Realm所说,如果你试图在一个线程中打开两个写入事务,你的应用程序逻辑就会出错。我建议您检查一下您的逻辑,看看是否可以使其更加简化。

但无论如何,要修复当前代码,缓解此问题的一种方法是在设置头像URL时检查您是否已经处于写入事务中。

func getAvatarURL() {
    let inWriteTransaction = realm?.isInWriteTransaction
    do {
        if !inWriteTransaction {
            realm?.beginWrite()
        }

        avatarURL = avatarDelegate?.contactAvatarURL(eExtention: eExtention)

        if !inWriteTransaction {
            try realm.commitWrite()
        }
    catch let e {
        print(e.localizedDescription)
    }
}