-viewDidLoad
バックグラウンド スレッドの後およびバックグラウンド スレッドで呼び出したいメソッドがあります。この2つの方法を組み合わせる方法はありますか:
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
と
[self performSelectorInBackground:(SEL) withObject:(id)]
?
-viewDidLoad
バックグラウンド スレッドの後およびバックグラウンド スレッドで呼び出したいメソッドがあります。この2つの方法を組み合わせる方法はありますか:
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
と
[self performSelectorInBackground:(SEL) withObject:(id)]
?
Grand Central Dispatch はdispatch_after()
、指定されたキューで指定された時間の後にブロックを実行します。バックグラウンド キューを作成すると、必要な機能が得られます。
dispatch_queue_t myBackgroundQ = dispatch_queue_create("com.romanHouse.backgroundDelay", NULL);
// Could also get a global queue; in this case, don't release it below.
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC);
dispatch_after(delay, myBackgroundQ, ^(void){
[self delayedMethodWithObject:someObject];
});
dispatch_release(myBackgroundQ);
次のことを試してください。
// Run in the background, on the default priority queue
dispatch_async( dispatch_get_global_queue(0, 0), ^{
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
});
テストされていないコード
セレクター/メソッドで UIKit を使用したり (UI を更新しないでください)、UIKit プロパティ (フレームなど) にアクセスしたりしてはならないことに注意してください。そのため、セレクターは作業をメイン スレッドに戻す必要がある場合があります。例えば
(id)SomeMethod:UsingParams: {
// Do some work but the results
// Run in the background, on the main queue
dispatch_async(dispatch_get_main_queue(), ^{
// Do something UIKit related
});
}
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
呼び出されているスレッドでセレクターを実行します。したがって、バックグラウンドスレッドから呼び出すと、そこで実行されます...
あなたは例ごとにそれを行うことができます:
dispatch_time_t delay = dispatch_time( DISPATCH_TIME_NOW, <delay in seconds> * NSEC_PER_SEC );
dispatch_after( delay, dispatch_get_main_queue(), ^{
[self performSelectorInBackground: <sel> withObject: <obj>]
});
どういうわけか混合ソリューション。完全なGCDアプローチに固執する方が良いでしょう。