2011-01-06 9 views
0

これを理解しようとしています:マルチスレッドは別のスレッドでメソッドを実行する方法なので、メインスレッドをハングしません)。iphone - この種のマルチスレッド操作のロジックは何ですか

これはメインのコードに行く:スレッドがしようとする場合:

[NSThread detachNewThreadSelector:@selector(createNewThread) toTarget:self withObject:nil]; 

、ここでは、スレッドがこれで私の問題がある

-(void) createNewThread { 

NSAutoreleasePool* p = [[NSAutoreleasePool alloc] init]; 

[self performSelectorOnMainThread:@selector(doSomeStuff) withObject:nil waitUntilDone:YES]; 

[p release]; 
} 

行くしかし、私はこのようなものを見てきましたメインスレッドが何かをやらないようにしてください。なぜperformSelectorOnMainThreadを使ってdoSomeStuffが呼び出されていますか?それは気違いじゃない?つまり、あなたはメインスレッドで何かを実行するために2番目のスレッドを起動します。スレッドは実際には使用しないでください。

私はWeb上でこのように多くのコードを見てきました。

おそらくそれはスレッドセーフではない何かをしているので、そのように行われていますが、これは本当に便利ですよね?私には全く役に立たないと聞こえて、何かをする方が良いでしょう。

[self performSelector:@selector(doSomeStuff) withObject:nil afterDelay:0.01]; 

あなたはどう思いますか?ありがとうございます。

+0

これはコード全体ですか、スレッドは何か他のことをしていますか? – JustSid

+0

いいえ、私はこのようなスレッドの多くの例を見てきました。おそらく、カウンターや他のもののようないくつかのコントロール変数はそれほど重要ではないかもしれませんが、多くの場合、performSelectonOnMainThreadで起動されるメソッドによって実際に行われます。あなたが尋ねたところで、私はあなたがあまりにもこのことを狂っていると思います。 – SpaceDog

答えて

3

performSelectorOnMainThread:withObject:waitUntilDone:呼び出しを実行ループの次の繰り返しで実行するキューに配置します。 performSelector:withObject:afterDelay:アクションを実行するタイマーを設定します。ただし、performSelectorOnMainThreadを呼び出すための新しいスレッドを作成することは、たとえメインスレッド上にすでに存在していても呼び出しをキューに置くため意味がありません。

+0

ありがとうございます。それが助けになった! – SpaceDog

0

これがcreateNewThreadメソッドの本体全体であれば意味をなさない。しかし、他のものがcreateNewThreadで実際に発生した場合、正当な理由があるかもしれません。 performSelectorOnMainThread:バックグラウンド・スレッドを使用するための最も一般的なシナリオは、バックグラウンド・アクティビティーの結果としてUIを更新する必要がある場合です。大規模なデータセットを処理していて、これまでの進捗状況をユーザーに示す場合と同様です。 UIKitはスレッドセーフではないため、バックグラウンドスレッドからUIを更新することはできません。しかし、あなたはループの中でたくさんの仕事をしているバックグラウンドを持っているかもしれませんし、ループを通るたびに(あるいは5、または何でも)メインスレッドに戻ってUIを更新してください。これにより、コードをメインループに戻してUIを更新するだけで、大量の作業のバックグラウンドに戻ることができます。

関連する問題