0

私の iPhone アプリでは、UITabBarController. 最初のタブ (アプリの起動時に読み込まれる) はローカル データを使用して読み込まれ、非常に高速です。

ただし、Web から XML ファイルをダウンロードして解析し、すべてのデータを に表示する 2 番目のタブは、UITableView低速の接続 (EDGE、3G) ではロードに時間がかかります。また、 内でパーサーを呼び出しているためviewDidLoad、すべてが完了するまでアプリは 2 番目のタブに切り替わりません。つまり、タブの読み込みに時間がかかることがあり、アプリがロックされているように見えます。

ユーザーにそのタブに切り替えてもらい、空の場合でもすぐにビューをロードしてから、データをダウンロード/解析/表示できるようにしたいと考えています。ネットワーク アクティビティ スピナーが回転しているので、少なくともユーザーは何かが起こっていることを知ることができます。

これが私の現在viewDidLoadです:

// Load in the latest stories when the app is launched.
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"Loading news view");

    articles = [[NSMutableArray alloc] init];

    NSURL *url = [NSURL URLWithString:@"http://example.com/mobile-app/latest-news.xml"];
    NSLog(@"About to parse URL: %@", url);
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    parser.delegate = self;
    [parser parse];
}

バックグラウンドでスレッドを実行する方法を示すこの記事を見つけましたが、そのコードを実装しようとしましたが、バックグラウンド スレッドがデータを UITableView にロードし直すことができませんでした。コードは呼び出されましたが、解析された記事はテーブル ビューに読み込まれますか?

4

1 に答える 1

3

セカンダリ スレッドでデータを読み込んだ後、UITableView をリロードする必要があることがわかりました。これですべてが解決しました。

セカンダリ スレッド + viewDidLoad 関数の最終的なコードは次のとおりです。

-(void)initilizeNewsViewWithData {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Start the network activity spinner in the top status bar.
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    articles = [[NSMutableArray alloc] init];
    NSURL *url = [NSURL URLWithString:@"http://example.com/mobile-app/latest-news.xml"];
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    parser.delegate = self;
    [parser parse];
    [tblLatestNews reloadData]; // Need to refresh the table after we fill up the array again.

    [pool release];
}

// Load in the latest news stories in a secondary thread.
- (void)viewDidLoad {
    [super viewDidLoad];

    [self performSelectorInBackground:@selector(initilizeNewsViewWithData) withObject:nil];
}

この回答からテーブル ビューを更新することを思い出しました: UITableView が解析されたデータを表示しない

于 2011-02-11T01:07:48.657 に答える