пʼятницю, 7 червня 2013 р.

Как с задержкой вызвать метод, у которого много параметров

Уже множество раз сталкивался с проблемой вызова мультипараметрового метода с задержкой.

С вызового метода с одним параметром проблем никаких нет:

//Вызов метода
[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 {
    ...
}

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments