Первый подход: с использованием селектора с задержкой
Вероятно, самый простой способ сделать это - использовать метод NSObject performSelector:withObject:afterDelay:
. Вы можете определить некоторый метод parsingDidTimeout
как таковой:
- (void)parsingDidTimeout {
if(self.parsingDidComplete == NO) {
[self.parser abortParsing];
// Create your error and display it here
// Try the fetch and parse again...
}
}
Для этого необходимо, чтобы вы вешали парсер как переменную экземпляра (self.parser
), чтобы вы могли отменить его из метода, который вы определили. Также необходимо, чтобы ваш делегат синтаксического анализатора отслеживал, завершился ли анализатор (self.parsingDidComplete
, может быть установлено по умолчанию NO
и установлено в YES
в методе parserDidEndDocument:
делегата). Это сделано для того, чтобы избежать прерывания успешного разбора. После того, как это сделано, все, что нужно, это простой
[self performSelector:@selector(parsingDidTimeout) withObject:nil afterDelay:30];
и через тридцать секунд будет вызван ваш код прерывания синтаксического анализа, и вы сможете делать все, что вам нужно.
Второй подход: с использованием таймера
Вы могли бы упростить весь этот подход (возможно) в методе тайм-аута, используя NSTimer вместо вызова метода NSObject. Таким образом, если анализатор успешно завершает работу, вы можете просто аннулировать таймер, что позволит вам исключить предложение if
в методе parsingDidTimeout
(и, как следствие, также избавиться от BOOL
ivar). Инициализация таймера будет выглядеть так:
NSTimer *timer = [NSTimer timerWithTimeInterval:30.0
target:self
selector:@selector(parsingDidTimeout)
userInfo:nil
repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];