0

NSMutableArray通知をリッスンし、によって監視されているに更新を投稿するCocoaアプリがありますNSCollectionView。通知は大量に届くので、別のキューを使用して通知を処理し、それに応じて配列を更新することを考えていました。

現在、通知の登録に使用していますが、キューに指定するaddObserverForName:object:queue:usingBlockと、正常に機能します(配列とNSCollectionView更新の両方) 。ただし、(を使用して)[NSOperationQueue mainQueue]独自のキューを作成すると、更新が停止します。デバッガーを使用すると、監視しているアレイが更新されていることがわかります。[[NSOperationQueue alloc] init]NSCollectionView

これはバグですか、それともここで何かを見逃しましたか?

4

1 に答える 1

3

AppKit バインディングを使用する場合、ポストされる KVO 通知はすべて、正常に機能するためにメイン スレッドで発生する必要があります。そのため、バックグラウンド スレッドで通知ハンドラーから配列を直接変更すると、NSCollectionView は、メイン スレッドではなく、そのスレッドでトリガーされた KVO 通知を受け取ります。これが発生した場合の動作は未定義であり、せいぜい機能しませんが、最悪の場合、クラッシュやその他の奇妙な動作を引き起こす可能性があります。

通知のたびに更新することがパフォーマンスの問題であるほど大量の通知が届く場合は、次の 2 つのいずれかをお勧めします。

  • NSNotificationQueue (NSOperationQueue とは関係ありません) を見てください。これは、複数の投稿された NSNotifications を結合して、オブザーバーに送信される単一の通知にすることをサポートしています。
  • あなたがしているのと同じようにバックグラウンドで通知を聞いてください。次に、アレイに対して実際の更新を実行するときは、作業をできるだけ少なくしてから、その作業をメイン スレッドに置きます。-[NSOperationQueue addOperationWithBlock:]これを行うには、mainQueue を呼び出すのが簡単です。
于 2010-07-31T01:29:58.317 に答える