2012-06-22 19 views

答えて

21

グランドセントラルディスパッチは、指定されたキューで指定された時間後にブロックを実行する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); 
4
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)] 

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

+0

問題が 'ときことである[自己performSelector:(SEL)withObject:(ID)afterDelay:(NSTimeInterval)]を 'バックグラウンドスレッドで単独で使用され、それはそのUIを言及するため –

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のアプローチに固執することをお勧めします。

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 
    }); 
} 
+3

+1を実行していませんバックグラウンドスレッドから触れてはいけません。 – Barjavel

関連する問題