2017-02-02 5 views
0

実オブジェクトの追加/更新に親切にお手伝いします 私はユーザークラスを保存して更新したいと思います。 ユーザークラスはクライアントクラス、 で構成されます。クライアントクラスは、アバタープロパティとルームリストで構成されます。 問題は、Clientクラスのアバタープロパティとルームのリストがフェッチされ、異なるクロージャで同時にRealmにプッシュされるため、「Realmはすでに書き込みトランザクション中です。」というエラーに直面しています。異なるスレッドのRealmSwift更新オブジェクト

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

答えて

0

レルムと同じように、1つのスレッドで2つの書き込みトランザクションを開こうとすると、アプリケーションのロジックにエラーが発生します。あなたのロジックを見直して、より合理化できるかどうかを確認することをお勧めします。

しかし、現在のコードを修正するには、これを軽減する1つの方法は、あなたがアバター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) 
    } 
} 
関連する問題