3

メインスレッドで NSProgressIndicator を使用して、メソッド全体を実行しながら進行状況を更新しています。別のクラス ファイルからオブジェクトを呼び出して、そのオブジェクトがメイン スレッドの値に戻るのを待つと、NSProgressIndicator が消えることに気付きます。これは、他のオブジェクトから戻り値を取得するまでメインスレッドがブロックされているためだと理解しています。

したがって、私の質問は、メインスレッドでUIをブロックせずに更新し、他のオブジェクトをバックグラウンドで実行して、必要に応じてメインスレッドに値を返すための推奨される方法は何ですか. ブロックの使い方は知っていますが、ブロック操作で値を返すことはできません。私が必要としているのは、この疑似コードを支援するものです:

-(IBAction) main {

//Update progress indicator UI to show progress
//perform an call to another object from another class.
// wait till i get its return value.
//Update progress indicator UI to show progress
// Use this return value to do something.
//Update progress indicator UI to show progress


}

他のオブジェクトへの呼び出しが行われると、メインスレッドがブロックされているため、私が持っている決定的な NSProgressIndicator が完全に消えることに気付きました。ありがとう。

4

3 に答える 3

9

上記のコードは正しいアプローチではありません。main戻らないため、進行状況インジケーターは更新されません。メインスレッドにすばやく戻る必要があります。

代わりに、さまざまな時点でメイン スレッドの進行状況インジケーターを更新するバックグラウンド ブロックを設定します。たとえば、次のようになります。

- (IBAction)start:(id)sender {
  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

  dispatch_async(queue, ^{
    dispatch_async(dispatch_get_main_queue(), ^{[self.progress setProgress:0];});

    // Doing some stuff
    dispatch_async(dispatch_get_main_queue(), ^{[self.progress setProgress:.25];});

    // Doing more stuff
    dispatch_async(dispatch_get_main_queue(), ^{[self.progress setProgress:.75];});
  });
}

(はい、これによりキューが保持されますが、 はキューを保持していないselfため、ここでselfは問題ありません。)

于 2012-04-05T18:46:30.077 に答える
4

あなたはGCD( Grand Central Dispatch )であなたが探しているものを達成することができます。

開始するための例を次に示します。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
    dispatch_async(queue, ^{
        // Perform async operation
                dispatch_sync(dispatch_get_main_queue(), ^{
                    // Update UI
                });
    });
于 2012-04-05T18:44:28.027 に答える
0

操作は別のスレッドで実行する必要があるように思えますが、これはいくつかの方法で実行できますが、おそらく NSOperationQueue とカスタム NSOperation クラス (これらを設定するのは思ったより簡単です) または NSInvokeOperation クラスを使用することで最も簡単に実現できます。

次に、NSNotificationCenter を使用してメイン スレッドでメッセージをクラスに送り返すか、Key-Value Observing (KVO) を使用してオブザーバーとして設定できます。

要するに、さまざまな選択肢があり、最適なものを選択するには、基盤となるテクノロジを理解する必要があります。個人的には、 Apple のThreaded Programming Guideから始めて、もう一度読んで、ソリューションを構築する前にすべての利点を抽出したことを確認します。

于 2012-04-05T18:49:33.590 に答える