ウェブサイトのデータをテーブルビューに解析するアプリを作成しました。
データのダウンロードが完了するまでアプリが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秒の遅延があり、それが何であるか、そしてそれを修正する方法がわかりません。
何か案は?