Как справиться с зависанием программы при загрузке XML с плохого URL? - PullRequest
0 голосов
/ 21 ноября 2011

Я хочу обработать зависание моей программы, когда она загружает xml с неверного адреса.Я попробовал это с использованием @try и @catch, но это не работает.Могу ли я использовать альтернативную обработку?

@try{
    NSString *test=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@",addressLabel.text,portLabel.text]] encoding:NSUTF8StringEncoding error: nil];
}

@catch (NSException *ex) {
    NSLog(@"Bad IP address");
    return;
}

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

Запустите ваш XML Parser в NSThread и используйте уведомление об ошибках.

1 голос
/ 21 ноября 2011

Если вы используете NSThread, вам придется погрузиться в управление памятью, если вы не работаете в XCode 4.2 и не используете ARC.

Таким образом, есть два способа получения XML с сервера.

1) Используйте NSURLConnection, чтобы получить XML как объект NSData, и когда вы закончите загрузку данных, вы можете просто использовать эти данные.инициализировать объект NSString.NSURLConnection отправляет асинхронный вызов на сервер, чтобы он не замораживал ваше представление.

2) Вы можете использовать NSIncovationOperation и NSQueue для получения вашего XML, и это также не повлияет на ваш основной поток.как

-(void)myMethod{
NSString *test=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@",addressLabel.text,portLabel.text]] encoding:NSUTF8StringEncoding error: nil];
    [self performSelectorOnMainThread:@selector(handleString:) withObject:test];
}

Вы можете использовать объект NSInvocationOperation следующим образом

 NSInvocationOperation *opr = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myMethod) object:nil];
    NSOperationQueue *queue= [NSOperationQueue new];
    [queue addOperation:opr];

Когда будет вызван селектор выполнения, вы можете передать этот строковый объект XML методу handleString:.как

-(void)handleString:(NSString*)xmlString{
// Do something with string
}

Я надеюсь, что это немного прояснит ваше замешательство.Все это должно было дать вам представление о том, как вы можете достичь своей цели, не замораживая свой интерфейс, то есть основной поток.

regards,

Arslan

1 голос
/ 21 ноября 2011

initWithContentsOfURL - синхронный вызов. Управление вернется из функции только после завершения. Попробуйте использовать эту функцию как рабочий поток, чтобы ваш основной поток не был заблокирован.

0 голосов
/ 21 ноября 2011

Вам необходимо запустить все длительные операции во втором потоке, чтобы избежать блокировки основного потока.Используйте [self executeSelector: @selector (yourXmlDownloadMethod)].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...