-viewDidLoad
とバックグラウンドスレッドの後に呼び出すメソッドがあります。遅延とバックグラウンドスレッドでメソッドを呼び出す方法
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
と
[self performSelectorInBackground:(SEL) withObject:(id)]
:この2つのメソッドを結合する方法はありますか?
-viewDidLoad
とバックグラウンドスレッドの後に呼び出すメソッドがあります。遅延とバックグラウンドスレッドでメソッドを呼び出す方法
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
と
[self performSelectorInBackground:(SEL) withObject:(id)]
:この2つのメソッドを結合する方法はありますか?
グランドセントラルディスパッチは、指定されたキューで指定された時間後にブロックを実行する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);
[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のアプローチに固執することをお勧めします。
次のことを試してみてください。
// 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
});
}
+1を実行していませんバックグラウンドスレッドから触れてはいけません。 – Barjavel
問題が 'ときことである[自己performSelector:(SEL)withObject:(ID)afterDelay:(NSTimeInterval)]を 'バックグラウンドスレッドで単独で使用され、それはそのUIを言及するため –