1

私はココアのインターフェースを持っています。ボタンを押すといくつかのデータを処理したいのですが、動作している間はそのインターフェースを使い続けたいと思います。私は唯一の解決策はNSThreadだと思います。スレッドが生成された場合、IBActionメソッドから戻らないようにするロック機構がありますか?Cocoaインターフェイスのボタンを押してスレッドを開始し、スレッドの実行中にインターフェイスを使用し続けることはできますか?

+0

をarbitaryデータを渡すことができるようにuserInfoプロパティを追加することができます.phpしかし、これは私がオブジェクトとの通信を妨げる+機能を使用します。私はいくつかのグローバル変数とポインタをプロキシとして使用すると宣言しましたが、動作しますが、coreplot関数を呼び出すと処理が遅くなり、スレッドが終了するまで何もリフレッシュしません。私は関数を使ってみましたが、何も起こらず、ブレークポイントにも反応しません。私は、私は、下のsuggerstionsを見ていると思う –

答えて

3

いいえ、ロック機構はありません。新しいスレッドが開始され、現在のスレッドが続行されます。 NSThreadに加えて、performSelectorInBackground:withObject:とおそらくはNSOperationを見ることができます。

0

ココアについてはあまり知らないですが、ユーザーの入力を自由にしながらUIをフリーズしたまま(UIがフリーズしないように)、バックグラウンドで何かを処理する新しいスレッドを開始することは、両方のスレッドが一緒に(同時に)動作し、プログラマーは同期問題があればそれを処理しなければなりません。あなたは間違いなくこの技術を進めるべきです。

おかげで、 Sourabh

3

NSOperationを見てみましょう。 NSOperationは、役に立つようにサブクラス化しなければならない数少ないココアクラスの1つです。 NSOperationサブクラスにdelegateプロパティを追加すると、操作が完了したときに通知を受け取ることができます。 http://softpixel.com/~cwright/programming/threads/threads.cocoa:また、あなたは私からの例を踏襲し、操作がデリゲートに戻っ

@implementation MyNSOperationSubclass 

-(void)main 
{ 
    //do operation here 



    //operationResult is used to report back to the delegate. operationResult could include a userInfo key so that the delegate can have some data passed back, or an error key to indicate success of the operation. 
    NSDictionary *operationResult; 


    //Some checks to ensure that the delegate implements operationHasFinished: should be added. 
    //waitUntilDone: YES locks the main thread 
    [[self delegate] performSelectorOnMainThread:@selector(operationHasFinished:)  withObject:operationResult waitUntilDone: YES]; 

} 

@end 
+0

デリゲートは、データがスレッドによって処理されているように私は私のインターフェイスをアニメーションすることができますので、まだ処理している間にメッセージを送信できるようになりますか? –

+0

はい。 NSOperationはスレッド化をカプセル化します。したがって、あなたのNSOperationサブクラスが実行する処理は、あなたのメインスレッド(またはそのような他のスレッド)に干渉することはありません。 NSOperationがメインスレッドに与える唯一の時間はperformSelectorOnMainThread:を呼び出すときですが、それは設計上のものであり、望ましい動作です。 –

関連する問題