Уже множество раз сталкивался с проблемой вызова мультипараметрового метода с задержкой.
С вызового метода с одним параметром проблем никаких нет:
//Вызов метода
[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 {
...
}
Немає коментарів:
Дописати коментар