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

Swift3 不同线程中的RealmSwift更新对象(闭包),swift3,realm,Swift3,Realm,请帮助添加/更新真实对象 我想存储和更新用户类。 用户类由客户端类组成, 客户端类由虚拟角色属性和房间列表组成。 问题是,我面临的错误是“领域已经在写事务中”,因为我的客户端类avatar属性和房间列表在同一时间以不同的闭包获取并推送到领域 func fetchRooms() { roomsDelegate?.contactRooms(entityID: entityID, success: {rooms in

请帮助添加/更新真实对象 我想存储和更新用户类。 用户类由客户端类组成, 客户端类由虚拟角色属性和房间列表组成。 问题是,我面临的错误是“领域已经在写事务中”,因为我的客户端类avatar属性和房间列表在同一时间以不同的闭包获取并推送到领域

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)
    }
}

就像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)
    }
}