我正在移植一個我爲iOS製作的Android應用。 Android有一個Yield()
函數來將線程從運行線程移動到線程隊列的後端(?)。這非常有用,所以這個線程不會佔用太多的CPU,並且讓其他所有的東西呆滯。它適用於我的Android應用程序。NSInvocationOperation等效收益
我正在使用NSInvocationOperation
對象來實現我的線程。如何添加類似於Android(POSIX's)Yield()
的功能?
我正在移植一個我爲iOS製作的Android應用。 Android有一個Yield()
函數來將線程從運行線程移動到線程隊列的後端(?)。這非常有用,所以這個線程不會佔用太多的CPU,並且讓其他所有的東西呆滯。它適用於我的Android應用程序。NSInvocationOperation等效收益
我正在使用NSInvocationOperation
對象來實現我的線程。如何添加類似於Android(POSIX's)Yield()
的功能?
我正在使用NSInvocationOperation對象來實現我的線程。
這並沒有什麼意義。 NSOperations運行在一個線程中,但它們本身不是線程,也不會讓你實現任何與線程等價的東西。如果您確實需要線程,請使用NSThread
或pthread
。
如何添加類似於Android(POSIX's)Yield()的功能?
如果您真的想要POSIX,請嘗試sched_yield()
。在更高的層次上,有pthread_yield_np()
(np表示不可移植 - POSIX中沒有pthread_yield()
) - 但除了調用sched_yield()
之外什麼都不做。
我不會打擾,直到你發現你真的需要這個,並且它有幫助。在iOS或Mac應用中做這類事情並不常見。
你看過Grand Central Dispatch嗎?這是在iOS上編寫多線程代碼的最佳方法之一。 (當然,這不是一個完美的解決所有線程問題的方法,所以它取決於你的應用程序。)作爲一個例子,GCD爲你提供了一些優先級較低的隊列,用於不關鍵性的操作。
編寫現代iOS應用程序的通常方法是隻在主線程上保留UI代碼(≈在主GCD隊列中),並將其他操作卸載到全局GCD隊列之一。來自這些隊列的塊不佔用主線程,它們被卸載到某個後臺線程(由系統管理,而不是你)。從程序員的角度來看,它非常簡單,它似乎工作得很好。
我建議你使用NSOperationQueue和subclassed NSOperations。這將有所幫助。
您可以使用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
// ...
});
});
更改'NSInvocationOperation'到'NSThread'(採用非常類似的語法),並呼籲'pthread_yield_np()'線程內。我不得不閱讀一下'NSThread'只是POSIX線程上的一個層,所以我具有所有這些低層次的好處。 – Warpspace 2012-03-07 05:18:10