Web サイトのデータをテーブルビューに解析するアプリを作成しました。
また、MBProgressHUD を使用して、解析が行われたときにユーザーにフィードバックを表示します。
viewDidLoad から読み込みメソッドを呼び出します。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
noConnectionAlert = [[UIAlertView alloc] initWithTitle:@"אין מידע להצגה"
message:@"אין אפשרות להתחבר לאינטרנט."
delegate:self cancelButtonTitle:@"אישור"
otherButtonTitles: nil];
HUD = [[MBProgressHUD alloc] initWithView:self.view];
HUD.labelText = @"טוען...";
[self.view addSubview:HUD];
[HUD showWhileExecuting:@selector(loadReports)
onTarget:self withObject:nil animated:YES];
BOOL hasConnection = [self hasInternetConnection];
if (!hasConnection) {
[noConnectionAlert show];
} else {
[self loadReports];
}
}
私は TabBar を持っているので、この読み込みは最初と 2 番目のビューで行われます。問題は、アプリが起動していて、TabBar の 2 番目のタブをタップしたときに (インターネット接続が遅い場合に) ラグが発生することです。
アプリをできるだけ早く起動する (またはタップすると次のタブに移動する) (そして、データの読み込みにかかる限り HUD を表示する) 別の方法はありますか?
編集:
ここにloadReportsがあります:
- (void)loadReports {
NSURL *reportsUrl = [NSURL URLWithString:@"http://www.iba.org.il/moked/index.aspx? classto=mokedTraffic"];
NSData *reportsHtmlData = [NSData dataWithContentsOfURL:reportsUrl];
NSString *encodedStringData = [[NSString alloc] initWithData:reportsHtmlData encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingWindowsHebrew)];
NSLog(@"%@", encodedStringData);
NSData *reportsHtmlDataEncoded = [encodedStringData dataUsingEncoding:NSUTF16StringEncoding];
TFHpple *reportsParser = [TFHpple hppleWithHTMLData:reportsHtmlDataEncoded];
NSString *reportsXpathQueryString = @"//table//tr//td";
NSArray *reportsNodes = [reportsParser searchWithXPathQuery:reportsXpathQueryString];
for (int i = 0; i < reportsNodes.count - 1; i++) {
TFHppleElement *nodeFirstChild = [(TFHppleElement *)reportsNodes[i] firstChild];
if ([[nodeFirstChild tagName] isEqualToString:@"text"]) {
NSLog(@"%@", reportsNodes[i]);
NSLog(@"%@", nodeFirstChild);
}
}
NSMutableArray *newReports = [[NSMutableArray alloc] initWithCapacity:0];
NSString *thisAttribute = [[NSString alloc] init];
NSDictionary *thisNode = [[NSDictionary alloc] init];
for (TFHppleElement *element in reportsNodes){
NSString *str = [[element firstChild] content];
if (str != NULL) {
TFHppleElement *firstChild = [element firstChild];
NSArray *childStrong = [element childrenWithTagName:@"strong"];
NSLog(@"%@", childStrong);
NSString *mokedContent;
for (TFHppleElement *strongElement in childStrong){
NSLog(@"%@", [[[strongElement firstChild] firstChild] content]);
mokedContent = [[[strongElement firstChild] firstChild] content];
}
thisNode = [element attributes];
thisAttribute = (NSString *)[thisNode objectForKey:@"width"];
if (thisAttribute == NULL) {
NSArray *spanChildren = [element childrenWithTagName:@"span"];
if (spanChildren.count > 0) {
TFHppleElement *spanChild = [spanChildren objectAtIndex:0];
NSString *spanContent = [[spanChild firstChild] content];
NSRange firstRange = [spanContent rangeOfString:@"\u00a0("];
BOOL isFound = NO;
if (firstRange.length > 0){
isFound = YES;
NSLog(@"String contains");
}
else {
NSLog(@"No found in string");
}
NSString *result = [spanContent stringByReplacingCharactersInRange:firstRange withString:@""];
NSRange secondRange = [result rangeOfString:@")\u00a0"];
NSString *time = [result stringByReplacingCharactersInRange:secondRange withString:@""];
NSLog(@"%@", time);
ORDKolIsrael *kolIsraelTraffic = [[ORDKolIsrael alloc] init];
[newReports addObject:kolIsraelTraffic];
NSString *reportFinal = [firstChild content];
kolIsraelTraffic.kolIsraelReport = reportFinal;
kolIsraelTraffic.kolIsraelTime = time;
NSLog(@"%@", kolIsraelTraffic.kolIsraelReport);
}
}
}
}
_reports = newReports;
[self.tableView reloadData];
}
編集 (2):
データを非同期に取得するメソッドを追加しました。
- (void)getDataFromUrlString:(NSString *)string
{
//Set database address
NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:string];
//prepare NSURL with newly created string
NSURL *url = [NSURL URLWithString:databaseURL];
//AsynchronousRequest to grab the data
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){
}
}];
}
私はviewDidLoadからこのメソッドを呼び出しますが、コードをデバッグしたときにCellForRowAtIndexPathに目的のデータが表示されたにもかかわらず、テーブルビューはデータ(空のテーブル)を取得していません。理由はありますか?