2

UITextview にログ テキストを書きたいと思います。例: x 画像が読み込まれ、y オブジェクトが作成されました。私の問題は、行が挿入された後に UITextView が更新されないことです。挿入が終了すると、すべての新しいテキストが同時に表示されると思います。

append = [@"" stringByAppendingFormat:@"\n%@ file is dowloading...", refreshName]
logTextView.text = [logTextView.text stringByAppendingString: append];

ダウンロード後、ファイルを保存して

append = [@"" stringByAppendingFormat:@"\n%@ file saved", refreshName];
logTextView.text = [logTextView.text stringByAppendingString: append];

私は試した

[logTextView setNeedsDisplay]

また

[logTextView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];

しかし、うまくいきませんでした:(

セッションは次のようになります。

  1. テキストビューに改行を挿入(ダウンロード)
  2. このテキストを表示
  3. ファイルのダウンロード (数秒)
  4. UITextViewに改行を入れる(ダウンロード完了)
  5. テキストを表示

それが起こることは次のとおりです。

  1. ファイルをダウンロードします(数秒)
  2. UITextView 表示行 (downloadig、ダウンロード完了)
4

1 に答える 1

1

テキストは、メイン スレッドの実行ループを通じて次回のみ更新されます。メイン ループで実行時間の長いタスクがあり、それが textView への書き込みを続けている場合、タスクが終了するまで何も表示されません。

これを修正するには、いくつかの方法を考えることができます。

  • 通常のディスパッチ キューで大きなタスクを実行し、dispatch_async(dispatch_get_main_queue(), append this new text); を使用して textView にメッセージを返します。アイデアは、タスクがセカンダリ スレッドで実行される (そのため、UI に直接メッセージを送信できない) が、短いブロックをメイン キューに送信して UI を更新するというものです。

  • 大きなタスクをチャンクに分割し、それぞれのチャンクをメソッドで開始できます。この場合、メイン キューで最初の 1 つを実行してから、更新された UITextView テキストを含むブロックをメイン キューにディスパッチし、続いて次の作業のチャンクを実行します。あれは:

    dispatch_async(dispatch_get_main_queue(), ^ { textView テキストを更新; [self doTask1:maybeSomeDictionary]; }

doTask1 が完了すると、次のブロックがディスパッチされます。

dispatch_async(dispatch_get_main_queue(), ^
{
    update textView text again;
    [self doTask2:maybeSomeDictionary];
}

最後のタスクが完了したら、完了です。

于 2012-08-28T12:54:04.293 に答える