Подтвердить что ты не робот

Как вызвать метод с задержкой и в фоновом потоке

У меня есть метод, который я хочу вызвать после -viewDidLoad и в фоновом потоке. Есть ли способ объединить эти два метода:

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

и

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

4b9b3361

Ответ 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.