2

現在、コントローラーで複数の html サイトを要求して解析するプロジェクトに取り組んでいます。ユーザーにフィードバックを提供するために、データの処理中に表示される 2 つ目のビューを作成しました。ステータス ラベルとプログレスバーが表示されます。私のコントローラーには、ラベルのテキストを更新するポイントがいくつかあります。残念ながら、これは時々しか機能しません。これは、ラベルがたまにしか再描画されず、おそらく 1 秒に 1 回よりも頻繁に再描画されるためだと思います。

[label setNeedsDisplay] で再描画を強制しても機能しません。

また、ラベルのテキストをグローバル変数のテキストで更新し、ラベルの setNeedsDisplay を毎秒呼び出すスレッドも作成しましたしかし、結果は同じです。一部の変更のみが表示されますが、すべてではありません。

すべてが適切にセットアップされ、ラベルが nil になることはありません。updateMethod をログに記録すると、すべて問題ないようです。表示されないだけです!

乾杯

ここに私のスレッドのコードがあります

- (void)startUpdateStatusThread{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
[self performSelectorOnMainThread:@selector(updateFrequently) withObject:nil waitUntilDone:NO];
[pool release];
}



- (void)updateFrequently{
NSLog(@"updateFrequently: %@", currentStatus);
test++;
[self.statusLabel setText:[NSString stringWithFormat:@"%@ - %i", currentStatus, test]];
[self.statusLabel setNeedsDisplay];
[NSTimer scheduledTimerWithTimeInterval:0.0001 target:self   selector:@selector(updateFrequently) userInfo:nil repeats:NO];
}
4

3 に答える 3

3

setNeedsDisplayWeb サイトを解析している「スレッド」内からだけでなく、ラベルのテキスト プロパティを呼び出していると仮定しても、私は正しいでしょうか?

注意: UIViews (またはラベルのような UIView のサブクラス) への変更は、メイン スレッドで実行する必要があります。

私がお勧めするのは、ラベルを更新してsetNeedDisplayを呼び出すヘルパーメソッドを作成することです.Parser-Thread呼び出し内から

[mainViewController performSelectorOnMainThread:@selector(yourUpdateLabelHelper:) withObject:nil waitUntilDone:NO];

それはあなたの仕事を成し遂げるはずです。

于 2010-08-11T14:23:58.483 に答える
2

あなたはスレッドについて言及しています。UILabel などの UIKit コントロールは、メイン スレッドからのみ更新できることに注意してください。メインスレッドからのみラベルのテキストを設定しようとしていることを確認してから、まだ問題があるかどうかを確認してください。

質問の編集による編集:

まず、-setNeedsDisplay は、次に画面が更新されたときに再表示する必要があることをビューに通知するだけで、その時点で表示を強制しません。

次に、iPhone の画面は約 60 Hz で描画されます。これは、約 0.016666 秒ごとに更新があることを意味します。それよりもはるかに高速に更新しようとしているため、実際には約 160 分の 1 の更新のみが表示されます。

3 番目に、おそらく最も重要なのは、バックグラウンド スレッドから -startUpdateStatusThread を呼び出さない限り、スレッドを作成していないように見えることです。いずれにせよ、一度 -update を押すと、すべてがメイン スレッドに戻ることがよくあります。そのタイマーをスケジュールしている頻度では、おそらく CPU に過負荷をかけ、システムがラベルを描画する時間がないようにしています。したがって、新しいテキストを設定していても、レンダリングする機会を与えていません。そのタイマーの頻度を減らす必要があり、おそらく何をしようとしているのかを再考する必要があります.

于 2010-08-11T14:21:29.020 に答える
1

タイマーの作成は別の関数にする必要があると思います。繰り返しを許可し、タイマーをメンバー変数に保存して、deallocで閉じることができます。[NSTimer scheduleTimerWithTimeInterval:0.0001 target:self selector:@selector(updateFrequently) userInfo:nil repeats:YES]; }

更新関数は、コールバック関数として動作する必要があります。

よろしくアサヤグ

于 2010-08-11T16:10:40.300 に答える