2012-03-06 9 views
3

私はiOS向けに作成したAndroidアプリを移植しています。 Androidは、スレッドを実行からスレッドキューの後ろ(?)に移動するためのYield()関数を持っています。これは、このスレッドがあまりにも多くのCPUを必要とせず、他のすべてを低速にするのに便利です。私のAndroidアプリでうまく動作します。NSInvocationOperation収入相当額

私はNSInvocationOperationオブジェクトを使用してスレッドを実装しています。 Android(POSIX)のYield()に似た機能を追加するにはどうすればよいですか?

答えて

6

私はスレッドを実装するためにNSInvocationOperationオブジェクトを使用しています。

これはあまり意味がありません。 NSOperationsはスレッド内で実行されますが、スレッド自体ではなく、スレッドに相当するものを実装することもできません。本当にスレッドが必要な場合は、NSThreadまたはpthreadを使用してください。

Android(POSIX)Yield()に似た機能を追加するにはどうすればよいですか?

実際にPOSIXが必要な場合は、sched_yield()を試してください。より高いレベルでは、pthread_yield_np()があります(npはポータブルではない - POSIXにはpthread_yield()はありません)が、sched_yield()を呼び出す以外は何もしません。

あなたが実際にこれを必要としていることが分かり、それが助けになるまで私は気にしません。 iOSやMacアプリでこのようなことをするのは一般的ではありません。

+0

は 'NSThread'(非常によく似た構文を使用しています)に' NSInvocationOperation'を変更し、 'pthread_yield_np(と呼ばれる)'スレッド内。私は 'NSThread'はPOSIXスレッドの単なるレイヤーなので、それらの低レベルの良さをすべて覚えておかなければなりませんでした。 – Warpspace

1

Grand Central Dispatchを見ましたか?これは、iOSにマルチスレッドコードを書くための最良の方法の1つです。 (もちろん、すべてのスレッディング問題に対する完璧な解決策ではないため、アプリに依存します)。たとえば、パフォーマンス重視ではない操作に対して、GCDは優先順位の低いキューを提供します。

最新のiOSアプリケーションを書く一般的な方法は、メインスレッド(メインGCDキューの≈)にUIコードを保存し、他の操作をグローバルGCDキューの1つにオフロードすることです。これらのキューからのブロックは、メインスレッドを悩まさず、バックグラウンドスレッド(システムで管理されています)からオフロードされます。プログラマの視点からは非常に簡単です。とてもうまくいくようです。

0

NSOperationQueueをNSOperationsのサブクラスで使用することをお勧めします。それが助けになるだろう。

0

あなたはこのためにGCDを使用することができます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // Do the heavy work 
    // ... 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     // Reflect the result in the UI 
     // ... 

    }); 
});