Objective c 异步加载网站数据时的延迟

Objective c 异步加载网站数据时的延迟,objective-c,asynchronous,Objective C,Asynchronous,我编写了一个应用程序,可以将网站中的数据解析为tableview 我希望应用程序在下载完数据并将其显示到表视图之前阻止UI,因此我使用MBProgressHUD在解析发生时向用户显示反馈 我编写了以下异步下载数据的方法: - (void)getDataFromUrlString:(NSString *)string { NSDate *dateAtStartOfGetDataFromString = [[NSDate alloc] initWithTimeIntervalSinceNow:

我编写了一个应用程序,可以将网站中的数据解析为tableview

我希望应用程序在下载完数据并将其显示到表视图之前阻止UI,因此我使用MBProgressHUD在解析发生时向用户显示反馈

我编写了以下异步下载数据的方法:

- (void)getDataFromUrlString:(NSString *)string
{
   NSDate *dateAtStartOfGetDataFromString = [[NSDate alloc] initWithTimeIntervalSinceNow:0];
   NSLog(@"dateAtStartOfGetDataFromString = %@", dateAtStartOfGetDataFromString);

   NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:string];

   NSURL *url = [NSURL URLWithString:databaseURL];

   NSURLRequest *request = [NSURLRequest requestWithURL:url];
   NSOperationQueue *queue = [[NSOperationQueue alloc] init];

   [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
   {
     if ([data length] > 0 && error == nil){
        [self loadReports:data];
     }else if ([data length] == 0 && error == nil){

     }else if (error != nil && error.code == NSURLErrorTimedOut){ //used this   NSURLErrorTimedOut from foundation error responses

     }else if (error != nil){

     }
 }];
 NSDate *dateAtEndOfGetDataFromString = [[NSDate alloc] initWithTimeIntervalSinceNow:0];
 NSLog(@"dateAtEndOfGetDataFromString = %@", dateAtEndOfGetDataFromString);

}
这是loadReports:方法:

- (void)loadReports:(NSData *)data {
    //...Get the data into the table view data array

    [HUD hide:YES];
    _reports = newReports;

    [self.tableView reloadData];
    NSDate *dateAfterLoadReports = [[NSDate alloc] initWithTimeIntervalSinceNow:0];
    NSLog(@"dateAfterLoadReports = %@", dateAfterLoadReports);
}
应用程序加载速度非常快,并显示HUD,直到数据加载到表视图成功完成

问题是数据显示之前需要的时间有点太长(5秒)

我使用NSDate检查了应用程序加载和解析数据所需的时间:

2013-01-31 18:06:52.508 TrafficReport[4472:c07] dateAtStartViewDidLoad = 2013-01-31 16:06:52 +0000
2013-01-31 18:06:52.513 TrafficReport[4472:c07] dateAtStartOfGetDataFromString = 2013-01-31 16:06:52  +0000
2013-01-31 18:06:52.513 TrafficReport[4472:c07] dateAtEndOfGetDataFromString = 2013-01-31 16:06:52 +0000
2013-01-31 18:06:52.516 TrafficReport[4472:c07] dateAtEndViewDidLoad = 2013-01-31 16:06:52 +0000
2013-01-31 18:06:52.664 TrafficReport[4472:4a03] dateAfterLoadReports = 2013-01-31 **16:06:52** +0000
2013-01-31 18:06:57.569 TrafficReport[4472:4a03] dateAtStartCellForRow = 2013-01-31 **16:06:57** +0000
正如您在loadReports之后看到的,在它执行cellForRow方法之前有5秒的延迟,我不知道它是什么以及如何修复它


有什么想法吗?

您必须在主线程中执行所有UI更改:

....
if ([data length] > 0 && error == nil){
    dispatch_async(dispatch_get_main_queue(), ^{
        [self loadReports:data];
    });
}
....