的恩惠到期在8小時內。此問題的答案有資格獲得 100聲望獎勵。 Jeremy Friesner想引起更多人對這個問題的關注。
我有一個 MacOS/X 應用程式,它通常不反對應用程式小睡,但有時它會產生一個或多個子執行緒來執行對時間敏感的網路任務,這確實需要避免被應用程式小睡。
優雅的做法是讓這些執行緒中的每一個[[NSProcess processInfo] beginActivityWithOptions [...]]在啟動時呼叫,并[[NSProcess processInfo] endActivity [...]]在它退出之前呼叫,這將(希望)避免在我的行程(或至少在那些特定執行緒上)使用 app-nap ) 僅當這些網路執行緒中的一個或多個正在運行時。
我的問題是,這是一種合法/可接受的呼叫模式,還是NSProcessInfo更像是一種僅針對每個行程的 API,它沒有實作執行緒安全的參考計數邏輯,這對于可靠地產生預期行為是必要的,如果我從多個執行緒呼叫它?(如果是后者,我可以自己實作這個邏輯,但我不想在這里重新發明輪子)
uj5u.com熱心網友回復:
這個 API 被認為是行程范圍的,用于報告您的整個應用程式正在執行特定型別的作業,這應該或不應該受到節能啟發式的影響(再次,每個行程,而不是每個執行緒) .
使用它的最佳方法是在所有后臺執行緒開始之前開始一項活動,并在所有重要的后臺執行緒完成后完成它。
您可以使用 DispatchGroup 或您希望的任何其他工具來完成。
但這并不是唯一的方法。
beginActivityWithOptions 將回傳 _NSActivityAssertion,它通常不知道執行緒。你可以把你自己的執行緒同步機制帶到這個聚會上。
多次呼叫這個 API 會創建幾個 _NSActivityAssertion 物件,這絕對是多余的,但應該可以作業,如果你能正確地結束它們中的每一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/376724.html
