14

-viewDidLoadバックグラウンド スレッドの後およびバックグラウンド スレッドで呼び出したいメソッドがあります。この2つの方法を組み合わせる方法はありますか:

[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]

[self performSelectorInBackground:(SEL) withObject:(id)]?

4

4 に答える 4

23

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);
于 2012-06-22T19:06:28.300 に答える
7

次のことを試してください。

// 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
    });
}
于 2012-06-22T19:10:07.910 に答える
4
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]

呼び出されているスレッドでセレクターを実行します。したがって、バックグラウンドスレッドから呼び出すと、そこで実行されます...

于 2012-06-22T19:00:07.870 に答える
2

あなたは例ごとにそれを行うことができます:

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アプローチに固執する方が良いでしょう。

于 2012-06-22T19:07:31.580 に答える