2009-10-19 1 views
0

У меня есть следующие методы в моем классе:NSXMLParser избегает UILabel, чтобы показать/скрыть

-(IBAction)loginToAccount:(id)sender { 
// Display the network activity status indicator 
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

// Show the load indicator 
[self.loadIndicator startAnimating]; 
self.loadIndicator.hidden = NO; 
self.loadLabel.hidden = NO; 

[usernameTextField resignFirstResponder]; 
[passwordTextField resignFirstResponder]; 

[self CheckLoginCredentials]; 
} 

-(void)CheckLoginCredentials { 
NSString *APIURL = [[NSString alloc] initWithFormat:@"http://mysite.com/xml.xml"]; 
NSURL *url = [[NSURL alloc] initWithString:APIURL]; 
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
[APIURL release]; 
[url release]; 

[xmlParser setDelegate:self]; 
[xmlParser parse]; 
} 

Когда я комментирую [self CheckLoginCredentials], то loadIndicator получает анимированные и показано, но когда я раскомментировать [self CheckLoginCredentials], то loadIndicator не получает показано и тоже usernameTextField/passwordTextField resignFirstResponder do нет работа.

Что я делаю неправильно? Благодаря!

+0

Только что нашел обходной путь: Создал новый метод, называемый «- (IBAction) ShowLoader: (id) отправитель» и указал на «Touch Down» даже кнопки на пользовательском интерфейсе. Событие NSXMLParser связано с «Touch Up Inside». Есть ли у вас какие-либо идеи, если это правильное обходное решение? Благодарю. – TamTam

ответ

2

Я считаю, что -initWithContentsOfURL: является синхронным подключением по URL-адресам и, следовательно, блокирует поток, над которым он запускается, пока он не завершится.

Из-за этого индикатор прогресса не будет отображаться, поскольку он требует, чтобы поток, на котором он работает, имеет активный цикл цикла. Использование синхронного url-соединения в основном потоке блокирует пользовательский интерфейс в этом потоке, поэтому вы не увидите индикатор прогресса.

правильный способ сделать это было бы использовать NSURLConnection-х

+ (NSURLConnection *)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate 

Просто создать объект, который инкапсулирует NSURLRequest ваш запрос API, а затем передать его в этот метод на NSURLConnection.

Затем выполните обратные вызовы делегата, чтобы вернуть данные.

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

+0

Спасибо, Jasarien, это сработало! – TamTam