データモデルからの情報をユーザーインターフェイスに表示しています。そうするための私の現在のアプローチは、次のような委任によるものです。
@protocol DataModelDelegate <NSObject>
- (void)updateUIFromDataModel;
@end
GCDを使用してUIの更新をメインスレッドにプッシュし、コントローラークラスにデリゲートメソッドを次のように実装しています。
- (void)updateUIFromDataModel {
dispatch_async(dispatch_get_main_queue(), ^{
// Code to update various UI controllers
// ...
// ...
});
}
私が懸念しているのは、状況によっては、このメソッドが非常に頻繁に呼び出される可能性があることです(1秒あたり約1000回、それぞれが複数のUIオブジェクトを更新します)。これは、コマンドでメインスレッドを「スパム」しているように感じます。
これはメインスレッドに送信するには多すぎますか?もしそうなら、誰かがこれにアプローチするための最良の方法は何であるかについて何かアイデアを持っていますか?
私は調べましdispatch_apply
たが、データを合体するときにもっと便利なようですが、これは私が求めているものではありません-更新が頻繁すぎる場合は更新をスキップしたいので、かなりの量の更新のみがメインスレッドに送信されます!
別のアプローチを取り、代わりにタイマーを実装して、たとえば10ミリ秒ごとにデータを常にポーリングすることを検討していましたが、データの更新は散発的になる傾向があるため、そうするのは無駄だと感じています。
両方のアプローチを組み合わせて、私が検討した別のオプションは、更新メッセージを待って、設定された間隔でデータをポーリングするようにタイマーを設定し、データの変更が停止したように見える場合はタイマーを無効にすることで応答することです。しかし、これは問題を過度に複雑にするのでしょうか。また、適切なアプローチは、単に一定のタイマーを実行することでしょうか。
編集: ディスパッチソースを使用した適応を示す以下の回答を追加しました