2011-06-14 45 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