2

サブビューとしてUIKitオブジェクトを持つビューがあると想像してください(たとえば、UIActivityIndicatorViewこれは問題ではありません)。このビューには、doSomethingUIKit オブジェクトを何らかの方法で管理する と呼ばれるセレクターもあります (この例では、インジケーター ビューを開始または停止できます)。

NSInvocationOperationで(ビューのコード部分から)作成しinitWithTarget:self selector:@selector(doSomething) object:nilます。次に、に追加しNSOperationQueueます。そして、すべて正常に動作します。

どのように?!これは新しいスレッドであり、スレッドセーフではない UIKit オブジェクトでなければなりません! エラーが見つからない (そしてクラッシュが発生しなかった) のはなぜですか?

4

1 に答える 1

15

このクラスは、非同時操作を実装するNSInvocationOperationの具体的なサブクラスです。NSOperation

非同時操作では、操作のタスクは同期的に実行されます。つまり、操作オブジェクトは、タスクを実行する別のスレッドを作成しません。したがって、start非並行操作のメソッドが呼び出されると、操作は現在のスレッドですぐに実行されます。このstartようなオブジェクトのメソッドが呼び出し元に制御を返すまでに、タスク自体は完了しています。

ただし、 を使用するとNSOperationQueue、この動作が変わります。NSOperationQueue は常に操作を同時に実行します。非同時操作は、同時に実行するために別のスレッドを必要とし、NSOperationQueueこのスレッドを提供します。

これは、NSInvocationOperation直接実行すると、スレッドセーフな UIKit オブジェクトにアクセスできることを意味します (操作は同じスレッドで実行されます)。あなたの場合、 を使用している場合は、呼び出しセレクターからNSObject のperformSelectorOnMainThread:withObject:waitUntilDone:NSOperationQueueを使用して、メイン スレッドで UIKit オブジェクトを使用する作業をスケジュールする必要があります。

于 2010-05-17T05:30:32.203 に答える