2013-11-30 4 views
0

Этот код загружает вид таблицы:NSURLConnection занимает много времени

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //test data 

    NSURL *url =[[NSURL alloc] initWithString:urlString]; 
    // NSLog(@"String to request: %@",url); 
    [ NSURLConnection 
    sendAsynchronousRequest:[[NSURLRequest alloc]initWithURL:url] 
    queue:[[NSOperationQueue alloc]init] 
    completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
     if([data length] >0 && connectionError ==nil){ 
      NSArray *arrTitle=[[NSArray alloc]init]; 
      NSString *str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
      arrTitle= [Helper doSplitChar:[Helper splitChar20] :str]; 
      self.tableView.delegate = self; 
      self.tableView.dataSource = self; 
      [self fecthDataToItem:arrTitle]; 
      [self.tableView reloadData]; 
      NSLog(@"Load data success"); 

     }else if (connectionError!=nil){ 
      NSLog(@"Error: %@",connectionError); 
     } 
    }]; 
    // arrTitle = [NSArray arrayWithObjects:@"ee",@"bb",@"dd", nil]; 

} 

И это занимает 10 - 15с для загрузки. Как я могу сделать это быстрее? . Спасибо, Роб и rmaddy, проблема решена.

+2

Вам необходимо сделать обновления пользовательского интерфейса в основном потоке. – rmaddy

ответ

5

Как указывает rmaddy, вы должны сделать обновления пользовательского интерфейса в главной очереди. Несоблюдение этого требования, среди прочего, объясняет некоторые из проблем, которые вы испытываете.

Параметр queuesendAsynchronousRequest указывает очередь, в которой вы хотите запустить блок завершения. Таким образом, вы можете просто указать [NSOperationQueue mainQueue]:

NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
    if([data length] > 0 && connectionError == nil) { 
     NSString *str  = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     NSArray *arrTitle = [Helper doSplitChar:[Helper splitChar20] :str]; 
     self.tableView.delegate = self; 
     self.tableView.dataSource = self; 
     [self fecthDataToItem:arrTitle]; 
     [self.tableView reloadData]; 
    } else if (connectionError!=nil) { 
     NSLog(@"Error: %@",connectionError); 
    } 
}]; 

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

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 

    // do something computationally expensive here 

    // when ready to update the UI, dispatch that back to the main queue 

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

     // update your UI here 

    }]; 
}]; 

в любом случае, вы всегда должны сделать UI обновления (и, вероятно, модель обновления, тоже, чтобы сохранить эту синхронизированный) на главную очереди.

+0

Очень чистый, тщательный ответ. Отлично сработано. (Голосов) –

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