2010-03-06 2 views
0

что случилось с моим кодом?Индикатор активности начинается в конце загрузки

Я хочу включить индикатор поворота, когда view1.nib начинает загружаться. поэтому я положил [счетчик поворота]; in - (void) viewDidLoad. но он получит, что URL затем начать Spinner индикатор ...

- (void)viewDidLoad { 








[spinner startAnimating]; 

NSURL *originalUrl=[NSURL URLWithString:@"http://example.com/"]; 
NSData *data=nil; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:originalUrl cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; 
NSURLResponse *response; 
NSError *error; 
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 


NSURL *LastURL=[response URL]; 


NSLog(@"%@",LastURL); 



[backr,backrm,downloadr setEnabled:FALSE]; 

backr.hidden=YES; 
backrm.hidden=YES; 
downloadr.hidden=YES; 
[self nextr:0]; 
[super viewDidLoad]; 

}

ответ

1

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

Мне нужно использовать connectionWithRequest: delegate: или initWithRequest: delegate: методы и установить делегат на себя. Вы можете найти более подробную информацию здесь: Using NSURLConnection


EDIT:

Пример:

В интерфейсе определить его:

@interface YourInterface { 
@private 
    NSMutableData *receivedData; 
} 

затем в контроллере в viewDidLoad :

// your previous definition of your NSMutableRequest 

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

if (theConnection) { 
    // Create the NSMutableData that will hold 
    // the received data 
    // receivedData is declared as a method instance elsewhere 
    receivedData=[[NSMutableData data] retain]; 
} else { 
    // inform the user that the download could not be made 
} 

закончить, снова в вас контроллер, реализовать эти методы:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    // append the new data to the receivedData 
    // receivedData is declared as a method instance elsewhere 
    [receivedData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    // release the connection, and the data object 
    [connection release]; 

    // receivedData is declared as a method instance elsewhere 
    [receivedData release]; 

    // inform the user 
    NSLog(@"Connection failed! Error - %@ %@", 
      [error localizedDescription], 
      [[error userInfo] objectForKey:NSErrorFailingURLStringKey]); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // do something with the data 
    // receivedData is declared as a method instance elsewhere 
    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]); 

    // release the connection, and the data object 
    [connection release]; 
    [receivedData release]; 
} 
+0

как я могу изменить эту строку для использования connectionWithRequest: delegate data = [NSURLConnection sendSynchronousRequest: request returnResponse: & response error: & error]; – Naeim

+0

Я редактировал свой пост с примером. –

1

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

Либо запустите загрузку в фоновом потоке, либо используйте асинхронные методы NSURLConnection.

+0

как я могу запустить загрузку в фоновом режиме? – Naeim

+0

Либо [NSThread detachNewThreadSelector ...], либо посмотрите в документации для NSURLConnection. Лично я бы выбрал второй вариант. –

Смежные вопросы