Уже множество раз сталкивался с проблемой вызова мультипараметрового метода с задержкой.
С вызового метода с одним параметром проблем никаких нет:
//Вызов метода [self performSelector:@selector(myMethodWithOneParameter:) withObject:someObject afterDelay:3.0]; //однопараметровый метод, вызываемый с задержкой - (void)myMethodWithOneParameter:(id)object { ... }
А как вызвать этим способом метод, у которого несколько параметров? Конечно, можно сделать метод-посредник, который будет принимать массивом все параметры:
//Вызов метода [self performSelector:@selector(myMethodWithOneParameter:) withObject:[NSArray arrayWithObjects:object1, object2, object3, nil] afterDelay:3.0]; //однопараметровый метод-посредник, вызываемый с задержкой - (void)myMethodWithOneParameter:(NSArray *)object { [self myMethodWithFirstParameter:[object objectAtIndex:0] andSecondParameter:[object objectAtIndex:1] andThirdParameter:[object objectAtIndex:2]]; } //многопараметровый метод, который в итоге вызовем с задержкой - (void)myMethodWithFirstParameter:(id)object1 andSecondParameter:(id)object2 andThirdParameter:(id)object3 { ... }
Выше представленный метод является неоптимальным, поскольку мы используем метод-посредник, а также передаем параметры только типа, наследуемого от NSObject. Для того, чтобы передать иные типы, необходимо дополнительное преобразование.
Существует более корректный способ вызова многопараметрового метода без всяких посредников:
//указываем значение задержки в секундах double delayInSeconds = 3.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void) { //код, который исполнится в главном потоке через 3 секунды //вызываем многопараметровый метод напрямую [self myMethodWithFirstParameter:object1 andSecondParameter:object2 andThirdParameter:object3]; }); //многопараметровый метод, вызываемый с задержкой - (void)myMethodWithFirstParameter:(id)object1 andSecondParameter:(id)object2 andThirdParameter:(id)object3 { ... }
Немає коментарів:
Дописати коментар