Как вызвать метод с задержкой и в фоновом потоке
У меня есть метод, который я хочу вызвать после -viewDidLoad
и в фоновом потоке. Есть ли способ объединить эти два метода:
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
и
[self performSelectorInBackground:(SEL) withObject:(id)]
?
Ответы
Ответ 1
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);
Ответ 2
Попробуйте следующее:
// 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 (так что не обновляйте пользовательский интерфейс) или доступ к свойствам 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
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
Выполняет селектор в потоке, который он вызывает. Поэтому, когда вы вызываете его из фонового потока, он будет работать там...
Ответ 4
Вы можете сделать это на пример:
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.