0

ユーザーが管理 Web サイトから製品データをダウンロードできるようにする単純なカタログ アプリがあります。

ユーザーがボタンを押してダウンロードを開始すると、次のコードがトリガーされます。

- (IBAction)downloadProducts:(id)sender {
    outputText.text = @"Downloading data, please wait...";
    [Product loadData:outputText];
    outputText.text = @"Ok, download complete.";
}

outputText は、何が起こっているかをユーザーに知らせることになっている UITextView です。

Product クラスには、ダウンロードを処理する静的メソッドがあります。これはすべて問題なく動作します。唯一の問題は、ダウンロードが完了するまで uitextview への出力がブロックされることです。

すなわち。「データをダウンロードしています。しばらくお待ちください...」というメッセージは [Product loadData: outputText] の後まで表示されません。完了し、ダウンロード完了メッセージで即座に上書きされます...

どんな助けでも大歓迎です、

ありがとう

ジム

4

2 に答える 2

2

はい、ダウンロード リクエスト中は UI の更新がブロックされます。[Product loadData:outputText] を呼び出す前に待機する必要がある場合があります。

[self performSelector:@selector(someMethod:) withObject:nil afterDelay:1.0]; 

そして、置きます

[Product loadData:outputText];
outputText.text = @"Ok, download complete.";

その方法で。

または、ベスト プラクティスとして、別のスレッドまたはブロックを使用してダウンロードを開始します。これにより、ダウンロード中に UI を更新し続けることができます (UI の更新はメイン スレッド/キューでのみ行う必要があることに注意してください)。

于 2012-06-20T12:22:46.820 に答える
1

ユーザーのアクションに応じてロードしているため、このメソッドはおそらくメイン スレッドで呼び出されています。画面の更新は、メイン スレッドでのみ実行できます。そのため、メイン スレッドがデータの読み込みでビジーである間は、テキスト ビューを描画することもできません。

これに対する 1 つの解決策は、読み込みを行うバックグラウンド スレッドを開始することです。

于 2012-06-20T12:25:37.643 に答える