2

初心者obj-cの質問です。Appstore 向けではない簡単な iPad プレゼンテーションを作成しています。私の仕事は、いくつかのメソッドを実装し、それらの間に少しの休止を入れて次々と実行することです。主な構造は次のようになります。

  • 負荷を表示
  • 2 秒間一時停止してから、method1 を実行します
  • 2 秒間一時停止してから、method2 を実行します
  • 2 秒間一時停止してから、method3 を実行するなど...

-viewDidLoad から呼び出す最初のメソッド:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(firstCountStarts) userInfo:nil repeats:NO];

ビューがロードされてから 2 秒後にメソッドが開始されます。method1 の内部から、同じ方法でメソッド 2 を呼び出そうとしますが、method1 と同時に実行を開始します。同様に、メソッド 3 (メソッド 2 から呼び出されます) をトリガーし、その後のすべてのメソッドはまったく実行されませんでした。このすべてのメソッドを -ViewDidLoad に配置し、遅延して呼び出すようにしました。

 [self method1];
 [self performSelector:@selector(method2) withObject:nil afterDelay:2];
 [self performSelector:@selector(method3) withObject:nil afterDelay:4];
 etc...

しかし、method2が実行されなかった後にすべてのメソッドを呼び出した後。スレッドの問題を正しく理解していれば。異なるキューでメソッドを実行するために GCD を使用する必要がありますか? それとも他に問題がありますか?

ありがとう、同僚!

4

2 に答える 2

9

これらをNSOperationキューに追加できます...

NSOperationQueue *queue = [NSOperationQueue new];

queue.maxConcurrentOperationCount = 1;

[queue  addOperationWithBlock:^{
    [self method1];
}];

[queue  addOperationWithBlock:^{
    [NSThread sleepForTimeInterval:2.0];
    [self method2];
}];

[queue  addOperationWithBlock:^{
    [NSThread sleepForTimeInterval:2.0];
    [self method3];
}];

...

これにより、前の1つが終了した後にのみそれぞれが実行され、2秒の遅延が発生します。

ただし、これを使用してUIを実行する場合は注意が必要です。これはバックグラウンドスレッドで実行されるため、対処する必要がある場合があります。

たぶん、これはNSOperationをサブクラス化することでうまくいくかもしれませんが、それは多くの利益のために多くの作業です。

これを好きな場所から実行します。これらすべてをsetUpQueueなどと呼ばれる関数に入れることをお勧めします。

次に、viewWillAppearまたはviewDidLoadまたは他の場所から、ボタンを押すなどして...実行します...

[self setUpQueue];

あなたがしなければならないのはキューに何かを追加することです、それからキューはそれ自身を管理します。

于 2012-11-14T09:18:50.540 に答える