2013-01-31 39 views
0

我写了一个应用程序,它将网站中的数据解析为tableview。异步加载数据形成网站时的延迟

我想要应用程序阻止用户界面,直到完成下载数据并将其显示到表格视图,因此我使用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后看到有5秒的延迟,直到它执行cellForRow方法,和我不知道它是什么以及如何解决它。

任何想法?

回答

2

你必须在主线程中执行所有的用户界面的变化:

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