2011-08-17 10 views
16

「iOS、このメソッドをa.s.a.p.で実行しますが、この実行ループの繰り返しではありません。次の中で最も早いですが、この中にはありません。ありがとう」メソッドを呼び出す方法a.s.a.p.しかし、次の実行ループの反復で最も早い時期に?

は今、私はいつもこのようにそれをやっている:-doSomeOtherThingsは常に -doSomethingInNextRunLoop前に実行されることを前提に

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

ドキュメントは言う:0の遅延を指定

は必ずしもセレクタがすぐに実行 されることはありません。セレクタはスレッドの 実行ループに依然としてキューイングされ、できるだけ早く実行されます。

したがって、基本的には-doSomeOtherThings前に実行する-doSomethingInNextRunLoopを引き起こし、私はダイレクトメッセージを送信したかのようにメソッドが即座に呼び出されることが起こりことができますか?

どうすればそれをa.s.a.p.という名前にすることができますか。しかし、これと同じ実行ループの繰り返しは決してありませんか?

言葉を明確にする:実行ループとは、メインスレッドと、スレッドが新しいイベントのために再び準備ができるまで、すべてのメソッドが返さなければならない反復を意味します。

答えて

9

Appleがいつも特別なケースで遅延が0になることが懸念される場合は、常に1e-37ほどの遅延を指定することができます。 performSelector:withObject:afterDelay:のドキュメントは、セレクタが常に次の実行ループの繰り返しに対してスケジュールされることを保証するために、容易に読み取ることができます。

Appleがいつか特別なケースの遅れがあるかもしれないと心配しているのなら、NSRunLoopのperformSelector:target:argument:order:modes:を試してみてください。具体的には実行ループの次の繰り返しの実行をスケジュールします。

+0

素晴らしい!これを容易にするためのカテゴリが理にかなっています。 – openfrog

0

確かにこれを行うだけです。

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

これにより、実行順序が保証されます。

+1

常に例示のために使用されるこの簡単な例よりも複雑な場合にそのようにコードを再配置するのに便利(または可能)ではありません。 – Anomie

+0

本当にありません。 NEXT実行ループの反復処理では、実行する理由があります。それらのうちの1つ:UIを間にリフレッシュさせる。知覚されるパフォーマンスを改善する。他の多くの中で。それ以外にも、アナミーは正しい。 – openfrog

+0

確かに、Anomieからの返答は頭の爪に当たっていますが、コードの並べ替えが問題を解決できるケースもあることを指摘しています。ライターのブロックのようなビット、ときにはdevsは実際には横方向の計画があるときに問題を特定の方法で解決するためにハングアップしますB. FWIW標準performSelector:withObject:afterDelay:0の結果他のユーザーが作成したUIコードを最適化するためにこの技術を頻繁にブロックして使用します。 – Roger

1

私はあなたが結論書類を読むことが間違っていると思います。だから、基本的に私はちょうどあなたが引用文書の一部は、セレクタが常に上キューに登録されていることを述べている

番号をダイレクトメッセージを送っていたかのようにメソッドが即座に呼び出されることが起こりでき

ループを実行してください。したがって、それは決して直接のメッセージとして実行されることはありません。

"必ずしもそうではない"という最初の文章は少し誤解を招くかもしれませんが、私は第2文章で恐れることは起こらないことを本当に明確にするべきだと思います。GCD(グランドセントラルディスパッチ)を用い

+0

うまくいけば、私は多くの人々が次の繰り返しのために待機しているbeeingに依存すると確信しています。それでも、不確実性があります。 – openfrog

6

かなり自明:

dispatch_async (dispatch_get_main_queue(), ^{ 
    NSLog (@"This stuff runs in the next iteration of the main run loop"); 
}); 
関連する問題