2016-05-09 1 views
8

アプリケーションでは、Realmに定期的に100〜10,000個のオブジェクトを書き込む必要があります。明らかにこれは大きな書き込みですので、私はバックグラウンドでこの書き込みを実行しようとしています。そのためユーザーは他の操作を実行でき、書き込みに気付かないことさえあります。残念ながら、私の書き込みはバックグラウンドスレッドで実行されているとは思っていましたが、メインUIはまだブロックされています。私がレルムに書き込むために呼び出すメソッドのジストです。このメソッドは、ループしている配列から単一のオブジェクトに対して繰り返し呼び出されます。私は何か大騒ぎしているように見えますか?どんな助けでも大歓迎です。バックグラウンドスレッドで実行されたレルム書き込みはまだブロックされていますメインUI

func writeCustomerToRealm(inputCustomer:Customer) { 
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 
    dispatch_async(backgroundQueue, { 
    let realm = try! Realm() 
    realm.beginWrite() 
    realm.add(self.swapCustomerForRealmCustomer(inputCustomer)) 
    try! realm.commitWrite() 
}) 
} 
+0

メインスレッドがブロックしているときに実行していることを共有できますか?それがブロックされている間のスタックトレースは特に興味深いでしょう。 – bdash

+0

System TraceまたはTime Profilerのスタックトレースと同様にInstruments @bdash? – Amloelxer

+0

はい、タイムプロファイラは、メインスレッドが何をしているのかを表示する必要があります。メインスレッドがブロックされているときにデバッガを中断してメインスレッドのスタックトレースを調べるだけでも、メインスレッドがブロックされていることを確認するのに十分です。 – bdash

答えて

5

提供されたコードは、レルムを使用して非同期のバックグラウンド書き込みを実行する正しい方法です。バックグラウンド書き込みが進行中にメインスレッド自身が書き込みトランザクションを実行しようとしない限り、メインスレッドをブロックすべきではありません。

共有した計測器トレースは、メインスレッドで費やされた非アイドル時間の大半がWebソケットメッセージの処理に費やされたことを示します。 Realmに関連する作業がメインスレッドで発生していることは示されていません。メインスレッドのWebソケットメッセージ処理は、トレースの合計期間の45%を占め、発生しているブロックされたUIの原因になっている可能性があります。ウェブソケット処理時間の大部分は、NSDateFormatterに関連する作業を行うのに費やされます。特に、NSDateFormatterは、その基底であるCFDateFormatterを頻繁に再生するようである。これは、NSDateFormatterのプロパティが頻繁に更新されていること、または新しい呼び出しのたびに新しいNSDateFormatterインスタンスが使用されていることを示しています。これらの慣行はどちらも避けなければならない。

+0

ありがとう、ずっとbdash!これが修正プログラムでした。助けを感謝する – Amloelxer

関連する問題