2012-03-06 86 views
3

我正在移植一個我爲iOS製作的Android應用。 Android有一個Yield()函數來將線程從運行線程移動到線程隊列的後端(?)。這非常有用,所以這個線程不會佔用太多的CPU,並且讓其他所有的東西呆滯。它適用於我的Android應用程序。NSInvocationOperation等效收益

我正在使用NSInvocationOperation對象來實現我的線程。如何添加類似於Android(POSIX's)Yield()的功能?

回答

6

我正在使用NSInvocationOperation對象來實現我的線程。

這並沒有什麼意義。 NSOperations運行在一個線程中,但它們本身不是線程,也不會讓你實現任何與線程等價的東西。如果您確實需要線程,請使用NSThreadpthread

如何添加類似於Android(POSIX's)Yield()的功能?

如果您真的想要POSIX,請嘗試sched_yield()。在更高的層次上,有pthread_yield_np()(np表示不可移植 - POSIX中沒有pthread_yield()) - 但除了調用sched_yield()之外什麼都不做。

我不會打擾,直到你發現你真的需要這個,並且它有幫助。在iOS或Mac應用中做這類事情並不常見。

+0

更改'NSInvocationOperation'到'NSThread'(採用非常類似的語法),並呼籲'pthread_yield_np()'線程內。我不得不閱讀一下'NSThread'只是POSIX線程上的一個層,所以我具有所有這些低層次的好處。 – Warpspace 2012-03-07 05:18:10

1

你看過Grand Central Dispatch嗎?這是在iOS上編寫多線程代碼的最佳方法之一。 (當然,這不是一個完美的解決所有線程問題的方法,所以它取決於你的應用程序。)作爲一個例子,GCD爲你提供了一些優先級較低的隊列,用於不關鍵性的操作。

編寫現代iOS應用程序的通常方法是隻在主線程上保留UI代碼(≈在主GCD隊列中),並將其他操作卸載到全局GCD隊列之一。來自這些隊列的塊不佔用主線程,它們被卸載到某個後臺線程(由系統管理,而不是你)。從程序員的角度來看,它非常簡單,它似乎工作得很好。

0

我建議你使用NSOperationQueue和subclassed 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 
     // ... 

    }); 
});