2012-04-30 13 views
1

アプリの処理中に起こって活動を反映するために、リアルタイムにプログレスバーや他の進行状況インジケータを更新するとき、私はこの巧妙なコードスニペットを使用せずにこれを行う方法がわからなかっ:リアルタイムプログレスバーの更新

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];

そうでない場合は、プログレスバーは、それがその後、プログレスバーの結論にジャンプした場合に実行ループが終了するまで待機します。

あなたは、単一の実行ループ(または何私は、単一の実行ループであることを認識する)の間、進行状況を更新したい場合は、これはそうするための唯一の方法ですか?

はどのようにプログレスバーをリアルタイムに更新するようにコード化された通常ですか?

は、上記のコード危険ですか?私は実際には実行ループの直接操作についてあまり知らないし、理解していないアプリで何かをするのは気になる。このコードは機能しますが、それは良い考えですか?

答えて

3

は、バックグラウンドスレッド/ NSOperationQueue/GCDであなたの長い操作を実行し、定期的にUIを更新します。 UIは常にメインスレッド上で実行されるため、更新はすぐに有効になります。

for (...) { 
    // some process 
    // ... 

    dispatch_async(dispatch_get_main_queue(),^ { 
    [self.progressIndicator setProgress:x animated:YES]; 
    }); 
} 

一般に、UI全体をブロックするため、メインスレッドで長い操作や複雑な操作を実行したくない場合があります。

+0

、それがバックグラウンドスレッドで実行されているが、私は進捗情報を送信する方法を把握しようとしています。 – johnbakers

+0

GCDを使用してコードサンプルを追加しました。 –

1

私はNSTimerをこの種のニーズに使用しています。オーディオファイルを再生/ストリーミングする予定で、プログレスバーの位置にデュレーションを表示して、これが自分の方法である必要があるとしましょう。私の場合は

この情報がお役に立てば幸いです。..

+0

これをどうやって行うのですか?あなたのタイマーが繰り返し呼び出すメソッドには何がありますか?それはどのように必要な情報を取得していますか? – johnbakers

+0

これは私が作成するタイマである。 「myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0ターゲット:自己セレクタ:@selector(checkSearchResult :)ユーザー情報:リピートゼロ:YES]。 [myTimer fire]; ' 次に ' - (void)checkSearchResult:(NSTimer *)theTimer'が呼び出され、プログレスバーで再生する場所が表示され、ストリーミングせずにオーディオを再生している場合は、avplayeritem/avplayer、これで設定することができますか、ストリーミングしている場合は、自分の変数を増やして、どれが2番目であるかを知ることができます。 これは役に立ちます。 – iremk