1

別のキューで実行するブロックをセットアップし、遅延後に別のメソッドを呼び出します。

piemanQ = dispatch_queue_create(PIEMAN_QUEUE_NAME, NULL);
dispatch_async(piemanQ, ^{
    [self performSelector:@selector(sendReadyToPieman) withObject:nil afterDelay:1.0];
});

1 秒後に@selector(sendReadyToPieman)火災が発生することを期待していますが、何も起こりません。の doco を読みましたperformSelector:withObject:afterDelay:が、現在のキューにタイマーを介して追加されているメソッドについて説明しています。現在のキューの実行ループ モードを確認しましたが、nil が返されます。

以前にこの種のコードを実行したことは確かですが、これを 2 つの異なる場所で試しましたが、どちらの場合も実行されませんでした。しかし、それを a に置き換えると、dispatch_after(...)すべてが機能します。

誰でも光を当てることができますか?

4

2 に答える 2

2

私の推測では、dispatch_async はそれが言うことを行い、次のものを非同期で実行します。セレクターをキューに入れると、ブロックが終了し、非同期処理全体がなくなります。もちろん、キューに入れられたセレクターを含みます。

performSelector が何かを行うには、スレッドが生きている必要があり、runloop を実行する必要があります。

于 2012-09-10T13:33:16.687 に答える
2

代わりに、操作を NSOperationQueue に配置する必要があります。

NSOperationQueue *piemanQ = [[NSOperationQueue alloc] init];
piemanQ.name = @"some name";
[piemanQ addOperationWithBlock:^{
    [self performSelector:@selector(sendReadyToPieman) withObject:nil afterDelay:1.0];
}];

これは自動的に非同期になります。問題に対しては、C ソリューションよりも Objective-C ソリューションを使用することをお勧めします。

于 2012-09-10T13:33:22.283 に答える