2011-06-14 47 views
0

好的。简单的方法取消当前的NSXMLParser解析操作?

可以说我有一个UITextField,其中用户可以输入一个URL,例如:现在

http://foo.bar/foo/bar.asmx 

,如果应用程序被供给右URL,它将与一个NSData具有大约450 bytesize响应-700取决于返回值,这些值在用户之间有所不同。通话需要大约一秒左右的时间,并且NSXMLParser也在一秒钟内解析数据。

但每当我们在输入例:

http://apple.com/foo/bar.asmx 

我们收到的NSData有大约9700一bytesize而且,解析器通过无限解析这个数据。而且我不知道如何在用户输入无效网址时导致NSXMLParser解析为无穷大时抛出正确的错误消息。

我们试过用这个。

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 

xmlParser = [[NSXMLParser alloc] initWithData:myData]; 
[xmlParser setDelegate:self]; 
[xmlParser shouldResolveExternalEntities:YES]; 
[xmlParser parse]; 
[self performSelector:@selector(timeOutMyParser:) withObject:nil afterdelay:15]; 

[xmlParser release]; 
[connection release]; 
[myData release]; 

} 

现在

,什么与此代码恰好是永远不会执行performSelector因为它的运行下去解析。

所以总结:

为了减少错误我们的用户可以创建的数量,我们需要如果他们采取长期停止我们当前的NSXMLParser解析器的操作。

是否有任何EASY方式取消当前的解析操作?

+3

由于解析器在主线程上解析,并且主线程被解析阻塞,所以选择器永远不会被触发。我所做的是将解析放在NSOperation中,将NSOperation放在NSOperationQueue上,这将使其成为一个线程应用程序。然后你可以从线程或解析器委托方法本身调用abortParsing。 – krzyspmac 2011-06-14 08:21:00

+0

嗯好吧,你有任何资源或例子,我可能会停止线程,如果解析操作需要很长时间? – doge 2011-06-14 08:24:15

回答

1

问题是[xmlParser parse]阻塞了主线程,锁定了一切。

所以不是

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
    { 

    xmlParser = [[NSXMLParser alloc] initWithData:myData]; 
    [xmlParser setDelegate:self]; 
    [xmlParser shouldResolveExternalEntities:YES]; 
    [xmlParser parse]; 
    [self performSelector:@selector(timeOutMyParser:) withObject:nil afterdelay:15]; 

    [xmlParser release]; 
    [connection release]; 
    [myData release]; 

    } 

我这样做。

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 

xmlParser = [[NSXMLParser alloc]init]; 
[xmlParser setDelegate:self]; 
[xmlParser shouldResolveExternalEntities:YES]; 

[self performSelectorInBackground:@selector(someFunction) withObject:xmlParser]; 

[xmlParser release]; 
[connection release]; 
[myData release]; 

} 

其中someFunction就是这样的。

-(void)someFunction:(NSXMLParser *)parser 
{ 

parser = [[NSXMLParser alloc]initWithData:myData]; 
[parser setDelegate:self]; 
[parser parse]; 

[parser release]; 

} 
2

实际上,如果解析成功,调用[xmlParser parse]将返回布尔值,该值将为YES。否则返回。所以只需要接收布尔值。

BOOL parserSucceeded = [xmlParser parse]; 

在解析,如果你得到无效的数据在你的XML或者如果你想在一个条件来停止解析,您可以通过调用

[parser abortParsing]; 

取消解析你可以检查状态并采取适当的行动。

BOOL parserSucceeded = [xmlParser parse]; 

if (parserSucceeded) { 

    // Parser Succeeded 

} else { 

    // Parser Failed/Aborted 
} 
+0

当[xmlparser parse]语句启动解析器时,我们无法到达parsersucceeded变量,并锁定主线程。如果url是例如:apple.com解析操作需要永久。并崩溃。 – doge 2011-06-14 09:01:25

+0

@Da_smokes,通过查看XML的内容无法确定XML是有效的还是无效的? – EmptyStack 2011-06-14 09:07:04

+0

@Da_smokes,如果是这样,你可以很容易地中止解析 – EmptyStack 2011-06-14 09:29:48