7

私はサードパーティのSDKを使用するiPadプロジェクトに取り組んでおり、SDKコードを読んでそれとObjective-cについて学びました。非同期コールバックで次の行に出くわしました。

[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];

そのセレクターのドキュメントを読みました。関連する行は次のように見えます。

0の遅延を指定しても、必ずしもセレクターがすぐに実行されるとは限りません。セレクターは引き続きスレッドの実行ループのキューに入れられ、できるだけ早く実行されます。

[self performSelector:@selector(doSomething) withObject:nil afterDelay:0]単に書くのではなく、なぜ書くべきなのか判断できません[self doSomething]。ゼロの遅延は、すぐに電話をかける必要があることを意味しているように思われます。明らかに私は何かが欠けています。フレームワークの作成者がこのアプローチをランダムに選択した可能性は低いです。他のStackOverflowの回答も、これに光を当てていません。doSomethingセレクター自体が非同期であり、呼び出しが非同期コールバックで行われているため、「performSelector」セレクターが使用されていますか?

私は次のことを示唆する別のリンクを見つけました:

興味深いことに、afterDelayでperformSelectorを使用すると、警告[つまり、コンパイラの警告]も消えます。...

[自己performSelector:aSelector withObject:nil afterDelay:0.0];

では、作成者はこのコードを使用して、コンパイラの警告のみを抑制しましたか?その場合は、このスレッドで提案されているように、clang push/popsを介して警告を抑制することがおそらく望ましいでしょう。

著者が...afterDelayメソッドを使用した理由について誰かが説得力のある説明を持っているなら、私は感謝するでしょう。ありがとう。

2012年10月22日編集: @rmaddyがここで示した唯一の答えが私の状況に完全に当てはまるとは思いませんが、それでも良い答えなので、受け入れます。私はこの質問を監視し、何か新しいものを見つけたら戻ってきます。ありがとう。JZ

4

1 に答える 1

6

次のようなものの1つの可能な使用法:

[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];

'doSomething'が呼び出される前に、現在の実行ループを完了できるようにすることです。つまり、「doSomething」が呼び出される前に、現在の呼び出しスタックを完了することができます(現在のメソッドが戻ります)。多くの場合、これはUIを更新する機会を与えるために使用されます。

これ以上の文脈がなければ、作者の本当の意図を知るのは難しいですが、これは一般的な使用法です。

于 2012-10-19T03:43:29.270 に答える