Как проверить, есть ли executeSelector: ожидающий выполнения? - PullRequest
7 голосов
/ 05 октября 2011

В моем приложении для iPhone у меня есть несколько мест, где я могу сделать

[object performSelector: withObject: afterDelay:]

вызов. Все приводят к одному и тому же методу. Теперь в этом методе я хочу выполнить некоторый код только при последнем его вызове. Если бы это было первое, я мог бы просто сделать [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(thisMethod) object:nil] и быть уверенным, что его вызовут один раз.

Но есть ли способ узнать, есть ли какие-либо другие вызовы методов, ожидающие выполнения?

Я мог бы использовать счетчик в этом классе, который я увеличивал бы каждый раз, когда я устанавливал это выполнение с задержкой, затем уменьшал его в начале каждого вызова и выполнял код, только если этот счетчик обнуляется. Но мне интересно, если это лучший / приемлемый подход ...

1 Ответ

6 голосов
/ 05 октября 2011

Ну, что вы можете сделать, это так: каждый раз, когда вы звоните [object performSelector: withObject: afterDelay:], просто добавьте строку, которую вы упомянули выше.Вы могли бы на самом деле создать метод, который обрабатывает это для вас.Например:

- (void)performSelectorOnce:(SEL)selector withObject:(id)object afterDelay:(NSTimeInterval)delay
{
    [NSObject cancelPreviousPerformRequestsWithTarget:object selector:selector object:object];
    [self performSelector:selector withObject:object afterDelay:delay];
}

и чем где-либо еще вы используете [object performSelector: withObject: afterDelay:], просто замените его на [self executeSelectorOnce: withObject: afterDelay:];

Если вы хотите использовать это в нескольких объектахчем вы могли бы создать категорию NSObject и добавить туда метод.

Дайте мне знать, если это работает для вас.

...