Realm 0.99 からリストに対するオブジェクトの追加・変更・削除情報それぞれをコールバックの引数として得られるようになりました
そこで上記を利用したリストの追加読み込み処理を実装した際に遭遇した現象をメモします。
現象
リストの変更通知は監視したスレッド(基本的にはメインスレッド)の現在の Runloop が終了した後に通知が届くようです。
そのため UIScrollView
がスクロール中は Runloop が終了しないため、リストをスクロールしながら追加表示するということができませんでした。
対応
オブジェクトの保存後に強制的にメインスレッドの Runloop を動かしてあげるとスクロールしながら追加表示がうまくいきました。
func tick() {
dispatch_async(dispatch_get_main_queue()) {
NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 0.1))
}
}
// API レスポンスなどの別スレッドでの処理
try! realm.write {
// オブジェクトの保存
}
tick() // メインスレッドの Runloop を動かす
確認用サンプル
ViewController.doTick
を変更してビルドすると挙動が確認できます。