2017-02-02 11 views
0

は私が書くために次のメソッドを持つsignletonクラスを作成しましたが、間違ったスレッドのアクセスレルム間違ったスレッドのアクセスクラッシュ

は私が何を知ってみましょうので、それが時々クラッシュレルム

にこのパーティーや初心者に遅れます私はここで間違っている。この質問を尋ねるため

func save<T:Object>(_ realmObject:T) { 
    let backgroundQueue = DispatchQueue(label: ".realm", qos: .background) 
    backgroundQueue.async { 
     let realm = try! Realm() 
     try! realm.write { 
      realm.add(realmObject) 

     } 
    } 

}

答えて

2

ありがとう!間違ったスレッドアクセス例外は、Realmオブジェクトがスレッド境界を通過した結果です。 Passing Instances Across Threadsthis blog postのドキュメント(特にスレッドの閉じ込めに関するセクション)を読むことをお勧めします。 documented hereは可能与えられたレルムオブジェクトのスレッドセーフ参照をご提供し、

func save<T:Object>(_ realmObject:T) { 
    let realmObjectRef = ThreadSafeReference(to: realmObject) 
    let backgroundQueue = DispatchQueue(label: ".realm", qos: .background) 
    backgroundQueue.async { 
     guard let realmObject = realm.resolve(realmObjectRef) else { 
      return // although proper error handling should happen 
     } 

     let realm = try! Realm() 
     try! realm.write { 
      realm.add(realmObject) 
     } 
    } 
} 

ThreadSafeReferenceオブジェクト:

その例外を避けるために、あなたがするようにコードを変更する必要がありますスレッド境界を通過した後、安全に別のスレッドの中にいったん閉じ込められたオブジェクトに解決されます。私はこれが助けて、あなたが他の何かを必要としているかどうかを知らせたいと願っています乾杯!

関連する問題