0

UILabel「whileループ」内でを更新しようとしていますが、UILabelテキストが変更されていません。の場合と同様に、メインスレッドでの現在の実行ループサイクルの最後に表示されることを知っていますiOS。しかし、この問題をどのように解決できますか(ftp.AsyncFinished関数は外部のchilkat ftpモジュールによって提供されます):

データは毎秒更新されます。このフォーラムとAppleのドキュメントを検索しましたがUILabel、メインスレッドの「whileループ」内でを更新する正しい方法を見つけることができませんでした。メインスレッドがを更新できるようにするwhileループの代わりに何を使用できますかUILabel

while (ftp.AsyncFinished != YES) {
    // here is the code getting data from the cilkat FTP module stored in PercentOfFile and MinutesRemaining
    NSString *content =[[NSString alloc] initWithFormat:@"%.0f%% done%.0fmin left",PercentOfFile,MinutesRemaining ];
    [LabelProgress setText:content];
}
4

4 に答える 4

4

UI を更新するには、メイン スレッドの実行ループが完了する必要があります。つまり、メソッド (メイン スレッドで呼び出された場合) は、UI の更新が発生する前に戻る必要があります。その後、すべての更新が結合され、UI が再描画されます。

UIView を強制的に再描画する最も堅牢な方法は何ですか? を参照してください。より多くの背景のために。

あなたのwhileループは、非同期更新用に正しく設計されていません。whileループの途中で非同期データをフェッチするべきではありません。なんらかのコールバックに登録し (通常は自分自身を に設定delegate)、システムからの呼び出しを待つ必要があります。

于 2012-05-02T13:04:36.340 に答える
1

別のスレッドでアップロードの進行状況を呼び出し、コールバックに登録する必要があります。このメソッドを持つ CkoFTP2Progress から継承するカスタム クラスを作成します。

- (void)PercentDone: (NSNumber *)pctDone abort:(BOOL *)abort;

「ftp」という名前の CkoFTp2 オブジェクトと「UploadProgress」という名前のカスタム クラスがあると仮定して、コールバックを登録します。

[self.ftp setEventCallbackObject:self.uploadProgress];
于 2012-12-17T20:53:48.367 に答える
0
// update your UILabel here
// ...

// Delay execution of long-running task so that update of UILabel can be performed
dispatch_after( dispatch_time( DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC ), dispatch_get_main_queue(), ^{
     // long-running task 
     // ..
});
于 2015-04-27T10:11:21.547 に答える
0

while ループをバックグラウンド スレッドに移動し、そこから performSelectorOnMainThread を使用して setText を呼び出すことができます。

于 2012-05-02T09:38:26.433 に答える