NSXMLParser initWithContentsOfURL超时

时间:2009-12-04 20:38:39

标签: iphone nsxmlparser

当我使用initWithContentsOfURL解析Feed时,如何设置超时。有时我们的Feed返回空白响应,然后它会尝试永远解析Feed。我想设置30秒左右的超时,弹出UIAlertView,然后尝试重新分析Feed。

    NSURL *feedURL = [[NSURL alloc] initWithString:URL];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:feedURL];
    [parser setDelegate:self];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];

    [parser parse];

3 个答案:

答案 0 :(得分:3)

第一种方法: 使用延迟选择器

最简单的方法可能是使用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子句(因此,也可以删除{{1} ivar)。计时器初始化看起来像:

BOOL

答案 1 :(得分:1)

如果您使用NSURLConnection下载数据,则无法回答您的问题方向,但您可以完全控制请求和响应周期(以及没有其他线程的异步性)。这就是initWithContentsOfURL:正在做的事情。

答案 2 :(得分:0)

使用NSTimer又名Timer

的Swift 3示例
func startParseTimeoutTimer() {
    Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { (_) in
        if (self.busy) {
            self.parser?.abortParsing()
            self.parser = nil
            print("Show UI as NOT busy; we aborted for timeout \(Thread.current.isMainThread)")
        }
    }

}