0

XML をダウンロードして、UITableView の構築に使用される配列を設定しています。別の方法で通知されるまで、テーブルに表示する前に配列を完全にダウンロードする必要があると思います (また、配列はテキストのみで非常に小さいため、可能な限り遅い接続でも妥当な時間でダウンロードされます)。最も遅い場合でも 3 ~ 5 秒ほどかかるため、ダウンロード中にステータス バーにアクティビティ インジケーターを表示すると便利です。

私は電話をかけます...

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

...何かをする前に(すべてを行ったらオフにします)、人間の目で見えるようになるミリ秒単位でポップして終了します。

なぜ私がこの経験をしているのかについて何か提案はありますか?

ありがとう、Z@K!

4

2 に答える 2

1

同期ダウンロードは呼び出し元のスレッドで実行され、完了するまでスレッドをブロックします。これは、おそらくUIと同じスレッドで実行されます。ダウンロードが完了するまでスレッドをブロックしているため、アクティビティインジケーターが表示されないか、ダウンロードが完了するまで表示されて移動しません。

アプリが期待どおりに応答できるようにするには、同期ダウンロードを別のスレッドに配置するか、NSURLConnection:initWithRequest(マルチスレッド)を使用する必要があります。

于 2010-07-08T01:49:43.723 に答える
1

私にとって簡単な答えは、GCD、Grand Central Dispatch でした。コードを変更する必要はほとんどありませんでした...

私のコードは次のように始まりました...

self.table_array = [self.webQuery downloadAndParseXMLForTable];
[(UITableView *)self.view reloadData];

*webQuery は、Web から xml データをダウンロードして解析するカスタム オブジェクトです。**downloadAndParseXMLForTable は、XML ファイルを同期的にダウンロードして解析し、(NSArray *) オブジェクトを返してテーブル ビューをサポートするカスタム メソッドです。

以下の変更されたコードは、GCD を採用し、UI の応答性を維持するために必要な唯一の変更を示しています。

dispatch_queue_t table_download_queue = dispatch_queue_create("com.yourcompany.queuename", NULL);

dispatch_async(table_download_queue, ^{
    self.table_array = [self.webQuery downloadAndParseXMLForTable];
    dispatch_async(dispatch_get_main_queue(), ^{
        [(UITableView *)self.view reloadData];
    });
});

dispatch_release(table_download_queue);

それでおしまい!これが私の苦境にある他の人に役立つことを願っています...

乾杯、Z@K!

警告: WWDC 2010 で、GCD は現在 SECURE 送信をサポートできないことが言及されました。詳細は覚えていませんが、スピーカーのクインは非常に頑固でした。彼が提案したプロセスには NSOperation が必要だったと思います...

于 2010-07-08T14:28:46.460 に答える