2017-11-27 13 views
0

私は自分のプロジェクトのスレッドで関数を呼び出しています。iOSでスレッディングして関数の完了を待ちます

[self performSelectorInBackground:@selector(shortVibration) withObject: nil]; 

ループ内で呼び出されます。

私はこの関数を独自のスレッドで呼びたいと思います。

だから、私は再び私のスレッド関数を呼び出すにしたくない私は、それが同時に呼び出されたくない(このスレッドのコールがループ内にある場合...それはあります)最後のものが実行されるまで実行されます。

どうすればいいですか?

+0

ステップ1: 'performSelectorInBackground'を呼び出しません。ただしないでください。 NSOperationとGrand Central Dispatchはあなたのためにあります。 – matt

答えて

0

が、それは同時に呼び出すことがしたくない

「シリアルキュー」を示唆しています。これは、ディスパッチキューまたは操作キューになる可能性があります。しかし、シリアル・キューとは、一度に1つのタスクしか実行できないキューです。

繰り返し振動からループを切り離し、ループが進行している間に実行するタイマーを設定すると、繰り返し振動ルーチンが呼び出され、ループの最後にタイマーがキャンセルされます。標準NSTimerを使用して、任意のキューにコールをディスパッチさせるか、GCDタイマーを使用して、バックグラウンドキューでスケジュールすることができます。

この振動ルーチンの仕組みの詳細とループの性質によって異なります。さらに手助けをするために、より詳細な情報が必要です(例:より広い問題とこの「振動」ルーチンの性質)。

0

おそらく、独自に作成されたキューで関数を呼び出すことができるNSOperationQueueを見てください。キューは、独自のスレッドで実行されます。例えば

:operationCountで

NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc]init]; 
backgroundQueue.maxConcurrentOperationCount = 1; 
backgroundQueue.name = @"com.foo.bar"; 

[_backgroundQueue addOperationWithBlock:^{ 
     do what you want.... here you also have access to properties in your class. 
}]; 

あなたは、並列実行された操作の数を扱うことができます。また、NSOperationの独自のサブクラスを作成し、そこでコードを実行することもできます。次に、この[_backgroundQueue addOperation:SubclassOfNSOperation]のような操作を追加する必要があります。

これは少しお役に立てば幸いです。あなたの質問から、私はあなたにもっと詳しい情報を得ることができません。おそらくいくつかのコードを投稿してください。

関連する問題