2009-07-17 11 views
10

Objective-Cの新機能です。ノンブロッキングの方法で待つ方法を理解できません。私は、非同期にデータが取り込まれているオブジェクトを持っているので、別のメソッドで処理を進めるには、そのオブジェクトを待つ必要があります。今私はスリープ関数を使用していますが、これはアプリケーション全体をブロックし、myObjectはロードされません。Objective-Cのノンブロッキング待ち関数

while (!myObject) 
{ 
    sleep(1); 
} 
return myObject; 

EDIT:このコードスニペットは、myObjectがロードされる前に呼び出されるメソッドからのものです。この場合、実際にはこのメソッドでブロックしたいのですが、myObjectを含むすべてがロードされないようにします。

+0

おかげで、私はこの質問を発見し、彼の2番目のコードスニペット使用してそれを実現します。http: //stackoverflow.com/questions/149646/best-way-to-make-nsrunloop-wait-for-a-flag-to-be-set –

答えて

6

可能であれば、問題のオブジェクトがロードされたときにクラスをmyObjectLoaded:メソッドに呼び出すように指定します。それ以外の場合は、あなたが上に書いたものの最も慣用的なものは、myObjectのチェックを続けてタイマーを作成し、それが見つかると何かを行うタイマーを作成することです。

何らかの理由でメソッドの途中で実際に行う必要がある場合は、実行ループを実行し続けるループを作成する必要があります。それはあなたのアプリをブロックさせるrunloopの欠如です。

0

あなたはオブザーバーパターンを探しているようですね。 Appleはそれを "notification"と呼びます。

+0

本当に私が探しているものではありません。私は通知されたくありません、myObjectがロードされるまで* thisスレッドがブロックされるようにしたいのですが、私のコードはmyObjectが全くロードされないようにします。 –

0

あなたはいくつかの背景NSThreadは、この集団の操作を実行する必要があり仮定すると、あなたはあなたのオブジェクトがロードされるのを待つメインスレッドを停止しているためだNSObjectの方法performSelector:onThread:withObject:waitUntilDone

0

を好むかもしれません。メインスレッドはUIを駆動するスレッドであり、ユーザーの入力を待つためです。メインスレッドをブロックすると、アプリケーションのユーザーインターフェイスがブロックされます。

オブジェクトがロードされたときにメインスレッドが何かをしたい場合は、この方法はmyObjectLoaded作成します。そして、あなたの読み込みスレッドから呼び出す:myObjectControllerは任意のオブジェクトをすることができ

[myObjectController performSelectorOnMainThread:@selector(myObjectLoaded:) 
            withObject:myObject 
            waitUntilDone:NO]; 

も自分自身をMyObjectに。

3

NSNotificationが問題を解決するはずです。

http://developer.apple.com/documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html

代わりに、オブジェクト上で待機しているの、非同期にデータを移入し、あなたの他のオブジェクト(たとえば出版社)からの通知のために、このオブジェクトのレジスタを持っています。このPublisherオブジェクトの1つが終了し、NSNotificationがポストされます。このNSNotificationは待機中のオブジェクトによって自動的に選択されます。これは待つこともなくなります。

7

この小さな桃は(イン・オーダー20秒間遅延する)私のために働いた....チャックの答えに

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);