0

データのダウンロードを開始する前に、画面上の textView を更新しようとしています。現時点では、すべてのダウンロードが完了した後にのみビューが更新されます。ダウンロードの前または間に行うにはどうすればよいですか?

編集self.textView.text = @"Connection is good, start syncing...";:ダウンロードが始まる前にUIを更新したい。ただし、現時点では、ダウンロードが完了した後にのみ更新されます。

コードは次のようになります。

if ([self.webApp oAuthTokenIsValid:&error responseError:&responseError]) {
    self.textView.text = @"Connection is good, start syncing...";
    [self.textView setNeedsDisplay];

    [self performSelectorInBackground:@selector(downloadCustomers:) withObject:error];
}

私はこれに不慣れで、スレッドがどのように機能するかをまだ学んでいませんが、私が読んだところによると、downloadCustomers 関数はバックグラウンド スレッドを使用してメイン スレッドを離れ、UI を更新する必要があります。

4

2 に答える 2

1

ここでのパターンは、バックグラウンド スレッドでダウンロードを初期化し、UI 更新のためにメイン スレッドにコールバックすることです。

以下はGCDを使用した例です。GCDバージョンの利点は-downloadCustomers、呼び出す場所にインラインで挿入するために、 で行うことは何でも使用することを検討できることです。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   [self downloadCustomers];
      dispatch_async(dispatch_get_main_queue(), ^{
         [self.textView setNeedsDisplay];
      });
});
于 2013-04-08T07:55:14.040 に答える
1
if ([self.webApp oAuthTokenIsValid:&error responseError:&responseError]) {
    self.textView.text = @"Connection is good, start syncing...";
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      [self downloadCustomers];
      dispatch_async(dispatch_get_main_queue(), ^{
        //Do whatever you want when your download is finished, maybe self.textView.text = @"syncing finished"
      });
});
}
于 2013-04-08T10:55:17.090 に答える