Cocoa Binding。 [開発系とか]
ひさびさに、Cocoaな話題。
QuickTime Player 7.2をいろいろ調べていて気がついたのだけれど、マイティマウスのスクロールボールを一気に動かすと、QuickTime Playerがしばらく固まってしまうことに気がついた。
条件は、ムービーインスペクタを表示しているとき。
インスペクタを閉じると、さくさく動くのにね。
これはきっと、UIのアップデートをCocoa Bindingで処理してるからだと思う。
「大量更新がかかる可能性のあるUIのアップデートを」途中にワンクッション挟まないで、ダイレクトにモデルとつなげてしまうと、こうなっちゃうんだろうな。
基本的には、Quicktime - Movie構造体から、QTKit - QTMovieオブジェクトの情報の反映は、ほぼリアルタイムで行われると考えていいよね。で、問題は、この反映の際に、Key-Value Codingで更新が行われると、Cocoa BindingによってKey-Value ObservingしているUIのオブジェクトに、ダイレクトに更新通知が飛んでしまうという点。
つまり、このケースのように、スクロールボールで一気に移動させた場合、例えば値が百回更新されたら、UIの文字列の更新がコンマ数秒の間に百回分の通知が飛んでしまうと思う。テキストフィールドの書き換えを一気にまとめて百回行ったら、そりゃ厳しいよね。
Text Fieldとオブジェクトの属性をBindingすると、文字列のレンダリングまではほぼリアルタイムで行われることになる。実際のViewの更新は、Quartzによってダブルバッファされているので、そんなに頻繁には行われないけど。
//
このパターンで引っかかったときは、自分ならBindingを使わずに、タイマー駆動で遅延をかける方法を使うな。例えば0.1秒の間に5回も10回も更新させる必要はないだろうから、例えば0.2秒待ってからUI側の書き換えを行うようにスケジュールする。基本的に、MVCのコントローラで遅延操作をする形。
//
Cocoa Bindingを使いつつ、更新頻度をまとめるっていう方法があれば、簡単でいいんだけどな。今のところQuartzによるダブルバッファはあるけど、テキストフィールドにおけるのテキストのレンダリングを遅延させる機能はないだろうし。
ん?もしかして、テキストフィールドのサブクラスを作って、View自体に更新を遅延させるような仕組みを作れればよりスマートなのかな?
・・・方法が思いつかない。やっぱり細かいところはよく理解できていないな。






コメント 0