4

私は KVO で売られていますが、明らかな方法で使用されている場合、それは同期的です。多くの KVO メッセージを立て続けに送信し、KVO メッセージの処理中にアプリが停止する状況で使用したいと考えています。NSOperationおそらくorを使用して、ここで機能するアプローチを誰かが提案できますかNSThread?

私の目標は、可能であれば KVO の分離された柔軟性を維持することです。

4

3 に答える 3

13

KVO 通知が変更と同じスレッドで配信されるという点で、KVO は本質的にシングル スレッドです。

もちろん、UIKit と Cocoa はどちらも、メイン スレッドで UI 要素を操作することだけを望んでいます。

したがって、非同期操作を行っている場合は、スレッドを使用している可能性が高く、スレッドからメイン スレッドへの通知を取得する必要があるという点で、既に同期の問題が発生しています。

そしてそこに鍵があります。各変更通知をやみくもに転送する代わりに、メインスレッドに渡す前に変更通知を結合できます。

これを行うには、さまざまな手段があります。特定のソリューションは、ほとんどの場合、アプリケーションに固有のものになります。

個人的には、きめの細かい操作の合体と転送を避けるようにしています。オブジェクトの特定のサブグラフが変更されたことをメインスレッドに伝える方がはるかに簡単だと思います。おそらく、変更をユーザーに表示する描画コードは、関連する状態を再描画する必要があるため、関連する変更が自動的に反映されます。

ご想像のとおり、キーは通知を調整して、アプリの応答性を低下させないようにすることです (またはデバイスのバッテリー寿命を破壊しません)。

于 2009-08-15T20:54:03.327 に答える
3

Apple https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/ReceptionistPattern/ReceptionistPattern.htmlが推奨する Receptionist パターンを使用します。

于 2014-01-22T10:47:50.310 に答える
0

NSNotification を確認してください。まったく同じというわけではありませんが、バックグラウンド スレッドで通知を送信することはできます (少し調べて作業する必要があります)。優れたデカップリングとファイア アンド フォーゲットの動作を維持できます。

于 2009-08-17T00:54:58.607 に答える