2012-11-13 10 views
6

私はXcodeとObjective-Cの新機能ですので、私はまだ何をしているのか分かりません! ;-)
基本的には、後でUDP Socketsを使用して他のAppsと通信する2つのスレッドを実行できるIPhoneアプリケーションが必要です。Objective-Cで2つのスレッドを作成

UIのstart-Thread/stop-Threadボタンが押されたときに反応するように関数を配置しましたが、実際にスレッドを作成して開始するコードを入力したいと思います。

  • 正しい手順は次のとおりです。
  • NSThreadをサブクラス化する必要がありますか?
  • ここで、新しいスレッドが実行するコードを実装しますか?

    私はrunメソッドなどを見ることができません。私はそれが私が理解していないselectorと関係があると思います。

+0

[スレッドプログラミングガイド](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html)と[NSThreadリファレンス](https: /developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html)。 'NSThread'をサブクラス化すると、通常は' main'メソッドがオーバーライドされます。 – omz

+5

[ディスパッチキュー](http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102)を使用することをお勧めします。 -SW24)を使用してください。 – Kevin

+0

2番目のディスパッチキュー。 – Wevah

答えて

14

dispatch queuesを使用してください。それらは基本的に軽量スレッドであり、スレッドや待ち行列を直接気にする必要はありません。

-(void) spawn 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [self doWorkInBackground]; 
    }); 
} 

組み込みキューのいずれかを使用することも、独自のキューを使用することもできます。

おそらく、blocks、特にメモリ管理の面で読むべきでしょう。

+0

答えがありがとう、私はガイドを読んで始めた。しかし、私が今理解している限り、シリアルまたは並行キューを持つことができます。シリアルのものでは、いつでも1つのタスクしか実行されません。これは2つのタスクが同時に発生する可能性があるため、私には不十分です。だから私は並列キューが必要ですが、システムは並行実行するタスクの数を管理していました。しかし、私は2つのタスクを正確に実行する必要があります。しかし、一般的には、2つのブロックまたは1つの「スレッド」を実行する関数を作成してキューに入れる必要がありますか? – user1809923

+0

ブロックはコードの残りの部分とインラインで書かれているので、スレッドごとに1つのブロックを持つ必要があり、スレッドは短くはありません。 – user1809923

+0

ブロック外のブロックを宣言できます。 –

1
- (void)performBlockInBackground:(void (^)())block { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     block(); 
    }); 
} 

は、その後、あなたはこのようにそれを呼び出す:

[self performBlockInBackground:^{ 
    NSLog(@"Log from background"); 
}]; 
+0

ブロックがNULLでないかどうかをチェックしないと、そのメソッドがクラッシュします。 – danielbeard

+0

@danielbeardはい、もちろんですが、なぜあなたは '[self performBlockInBackground:NULL];'を呼びますか? – NSAddict

+0

ブロックが別のオブジェクトに格納され、ブロックが割り当て解除された場合、ブロックはNULLになります。例えば。 'someObject.actionBlock' – danielbeard

1

またNSOperationを使用して検討することができます。これは、フードの下でディスパッチキューを使用しますが、より高いレベルのAPIと進行中の操作をキャンセルする可能性があります(これはあなたにとって有益かもしれません)。

関連する問題