第一种方法: 使用延迟选择器
可能最简单的方法是使用 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 方法调用,您可以在 timeout 方法中使整个方法(可以说)更简单。这样,如果解析器成功完成,您可以简单地使计时器无效,从而允许您消除方法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];