2017-08-22 6 views
4
  1. データベースをクリアします。
  2. 新しいデータを取得するAPI呼び出しを行います。
  3. APIから取得したデータをバックグラウンドスレッドのデータベースに書き込みます。
  4. メインスレッドとレンダリングUIでデータベースからデータを読み取ります。

手順4では、データは最新のデータである必要がありますが、データは表示されません。こうしたメインスレッド、通知の結果としてupdate to the latest version of the data in the Realm fileとしてrunloops、とのスレッドでバックグラウンドスレッドでレルムに書き込んだ後、メインスレッドに更新データが表示されない

// remark: all main thread shared a realm object 
DBManager.deleteAll() 
// call api success, get newdata 
DispatchQueue.global(qos: .background).async { 
    DBManager.initDBData(<newdata>) 
    DispatchQueue.main.async { 
     print("has data?????", DBManager.getBrands().count) 
    } 
} 

// when write 
func write() { 
    let realmBackgroud = try! Realm() 
    try! realmBackgroud.write {} 
} 
+0

ここで、書き込み関数を呼び出しましたか? –

答えて

1

レルムインスタンスは、そのスレッドの実行ループに掲載されています。バックグラウンドスレッド上で書き込みトランザクションをコミットするときと、その通知が別のスレッドのrunloopによって受信されるときの間に時間ウィンドウが存在し、CFRunLoopがその通知ソースに対してディスパッチキューを処理する順序のためにdispatch_asyncが珍しいことではない書き込みトランザクションがコミットされた直後に実行されたメインキューは、通知が配信される前に処理されます。

  • 使用など、コレクションの通知などレルムの通知メカニズムの一つ、あなたが明示的にdispatch_asyncを使用するのではなく、バックグラウンドスレッドで行われた変更に反応する:

    は、この問題に対処するためのいくつかの方法があります。

  • スレッドが自動リフレッシュをトリガする通知を処理する可能性があるかどうかに関わらず、メインキューにディスパッチするブロックの先頭に明示的にRealm.refresh()を呼び出して、最新のバージョンに移行させます。
関連する問題