Простой способ отменить текущую операцию синтаксического анализа NSXMLParser? - PullRequest
0 голосов
/ 14 июня 2011

Хорошо.

Допустим, у меня есть UITextField, где пользователь может ввести URL-адрес, например:

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

Теперь, если приложение получит правильный URL-адрес, оно ответит NSData с байтовым размером около 450-700 в зависимости от возвращаемых значений, значения у разных пользователей различаются. Вызов занимает около секунды или около того, и NSXMLParser также анализирует данные в течение секунды.

Но всякий раз, когда мы вводим, например:

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

Мы получаем NSData с байтовым размером около 9700. И анализатор анализирует эти данные через бесконечность. И я понятия не имею, как выдать правильное сообщение об ошибке, когда пользователь сделал ввод в недействительный URL, в результате чего 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];

}

Теперь, что происходит с этим кодом, так это то, что executeSelector никогда не выполняется, так как он всегда выполняет анализ.

Итак, подведем итог:

Чтобы уменьшить количество ошибок, которые могут создавать наши пользователи, нам нужно прекратить текущие операции синтаксического анализатора NSXMLParser, если они будут продолжительными.

Есть ли ЛЕГКИЙ способ отменить текущую операцию синтаксического анализа?

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

На самом деле вызов [xmlParser parse] возвращает логическое значение, которое будет ДА , если синтаксический анализ завершился успешно.Возвращает NO в противном случае.Так что просто получите логическое значение.

BOOL parserSucceeded = [xmlParser parse];

Во время синтаксического анализа, если вы получили недопустимые данные в своем XML или если вы хотите остановить синтаксический анализ условия, вы можете отменить синтаксический анализ, вызвав

[parser abortParsing];

И вы можете проверить статус и выполнить соответствующие действия.

BOOL parserSucceeded = [xmlParser parse];

if (parserSucceeded) {

    // Parser Succeeded

} else {

    // Parser Failed/Aborted
}
1 голос
/ 15 июня 2011

Проблема была в том, что [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 - что-то вроде этого

...