2011-01-02 8 views
2

私はスレッディングiPhone

// codeline1 // codeline2

// codeline3(UIMAGE)

// coldline4 // codeline5

どのように実行しているイムいくつかのコードを持っていますコードライン3を別のスレッドとして実行させますか?画像が読み込まれるまでに時間がかかると、残りのコードはまだ読み込まれます。

多くの例ではメソッドを使用して新しいスレッドを起動しますが、別の方法ではなく新しいスレッドでその1行だけを実行したいとします。

[self performSelectorOnMainThread:@selector(myMethod) withObject:nil waitUntilDone:NO]; 
[self performSelectorInBackground:@selector(myMethod) withObject:nil]; 

答えて

2

画像が読み込まれている痛みは、画像が実際に表示されるまで(常に)遅延していることです。これはUIスレッドによって表示されます。したがって、別のスレッドでUIImageオブジェクトを作成しても、実際に何も起こらない(つまり、データは解凍されない)ため、デコレーションによって引き起こされる遅延はUIスレッドをそのまま遅延させるため、目のまばたきで行われますイメージを表示しようとします。

バックグラウンドスレッドのイメージから1つのピクセルを読み込み、イメージ全体(バックグラウンドスレッド内)で強制的に読み取ることを除いて、これを回避する方法は本当にありませんでした。 、次ににUIスレッドで画像を表示すると、UIスレッドにはデコード処理の負担がかかりませんので、画像の表示がより迅速になります。しかし、CPUはどちらか一方の方法でデコードする必要があるので、デコードがバックグラウンドで起こったときに、UIのやりとりがやりにくくなることに注意してください。

編集は、私はここで自分自身を修正/明確化する必要があります。デコードはないブロックメインスレッドを行いますが、それはそれで遅れています。イメージは、UIスレッドがそうするとすぐにデコードされます。これにより、提供したいユーザーエクスペリエンスが妨げられる可能性があります。これを回避し、イメージがプリロードされていることを確認するには、バックグラウンドで1ピクセルを読み込もうとするとよいでしょう。 UIImageのアプローチの代わりにCATiledLayerを使用することも可能ですが、これはまったくドロップインの代替ではありません。 (、どこからでも

dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
dispatch_async(mainQueue,^{[self doSomethingInThenMainThread];}); 

0

あなたはGCD

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0); 
dispatch_async(backgroundQueue, ^{codeline3;}); //unlike performSelectorInBackground:... you can write anything inside the block, not only a single method 

を使用することができますし、いくつかのUIまたはあなたが呼び出すことができ、メインスレッドで実行する必要がある他のものを更新する必要がある場合メソッドの場合はコードライン3の内部でさえ)完了しました;)

これはAppleが最も効率的に推奨する方法です。 (WWDC2010 - セッション131 - iPhone OSのパフォーマンス最適化) iOS 2.xまたは3.xでは動作しないという唯一の問題は、少なくとも4.0が必要だということです。

Standford iPhone Courseには、GCDとマルチスレッドに関する簡単な例があります。バックグラウンドスレッドに変更するタイミングと、メインスレッドに戻るタイミングは簡単です。詳細については、それらを見てください。

希望します。

+0

(これは、画像が表示時にメインスレッド上でデコードされるという問題を解決しますか? – mvds

+0

dispatch_applyのような他の関数を使っても、本当に必要な時間で画像を表示することはできません。これらのアプローチは、基本的にはAppをより速く/より速く反応させる(UI)ようにしています。デコードのSTILLはバックグラウンドで処理されるためです。私たちは時間がかかりません、私たちはそれを遅らせるだけなので、ユーザーは速いと感じますが、実際にはそうではありません。 – nacho4d

+0

良い点、私は私の答えを明らかにした。私は実際の画像の読み込みを強制することを意図していたので、 'addSubview:image'の直後に画像が表示されます。 – mvds