2

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に目的のデータが表示されたにもかかわらず、テーブルビューはデータ(空のテーブル)を取得していません。理由はありますか?

4

1 に答える 1

1
NSData *reportsHtmlData = [NSData dataWithContentsOfURL:reportsUrl];

この行は、リクエストが返されるまでプログラムを一時停止します。ユーザーがビューを操作したくない場合は、非同期リクエストをセットアップし、リクエストが完了するまで操作できないビューを表示します。

したがって、非同期接続が必要です。NSURLConnectionのドキュメントを読んでください。

つまり、接続オブジェクトを作成する必要があります。

NSURLConnection *connection = [NSURLConnection initWithRequest:request
                                                      delegate:self];

次に、次のようないくつかのデリゲート メソッドに応答します。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- (void)connectionDidFinishLoading:(NSURLConnection *)connection

最後に、それを開始します。

[connection start];

または、AFNetworkingなどのライブラリを使用して、このセットアップをすべて簡単にすることもできます。

于 2013-01-30T18:26:36.887 に答える