您好,登錄后才能下訂單哦!
線程的可選方案
有時候,你不想繼承threads或不想自己創建和管理單獨的線程。例如,你想要一個定時器每2秒鐘調用你的方法,你可能會寫一個線程一直循環,然后睡眠2秒,然后調用你的方法。或者你可能想要寫代碼處理異步請求,比如從網絡上下載文件。或者當你的iPhone空閑時,你想要繼續進行重量級的計算處理。這些都不太容易實現或者可能會降低性能。我會討論一些解決的辦法。
NSTimer
NSTimer并不承諾會很精確;如果你設置每0.5秒觸發一次,實際上定時器觸發的時間可能在0.55和0.6秒之間。但是,如果你只是想相對準確的執行周期性任務的話,這是一個很好的機制。
重復和非重復NSTimer比較
你可以執行重復或非重復的定時器。對于重復的定時器來說,定時器會在你指定的時間間隔內觸發,不會停止。如果你想停止的話,你需要手工的使定時器無效。對于非重復定時器來說,它只會觸發一次,然后會自動的變為無效。對這兩種情況,一旦定時器無效了,你不能在重用它;你必須重新創建一個定時器對象。
要創建一個定時器,你可以使用:
+ scheduledTimerWithTimeInterval:target:selector:userInfo: repeats:
或使用:
+ timerWithTimeInterval:target:selector:userInfo:repeats:
第一種方法會創建一個新的定時器,然后添加到當前的run loop中,然后返回定時器對象給你。第二種方法僅僅創建一個定時器對象;你需要自己通過調用[aTimer addTimer: forMethod]來添加到你自己的run loop中。
當時候重復定時器時,如果你要使定時器變成無效的話,你需要調用方法:[aTimer invalidate];
注意:在一個沒有run loop的線程中,NSTimer是不能工作的。 |
異步函數
在很多情況下,異步函數比線程更輕量級。例如,iPhone環境能夠從線程池中重用線程來處理異步函數。更進一步,如果你需要處理100個異步函數,OS可能只需要10個線程,因為一個線程能夠處理多個異步函數。唯一的問題就是,它比你創建一些線程和一個異步請求來處理他們看起來更復雜。
Listing 6-9 代碼塊創建了一個異步請求到服務器上,然后合并返回的結果創建一個數據對象。
相比,使用簡單的線程和異步函數處理方案:
@autoreleasepool {
NSData *p_w_picpathData = [NSData dataWithContentsOfURL:p_w_picpathURL];
}
在某些情況下,你可能需要寫更多的代碼來獲得更好的性能。你僅僅需要確保實際上做的什么將對你有利。
如果你使用異步HTTP請求,你需要運行在一個后臺線程中。如果很長一段時間都沒有響應,iOS的策略可能會殺掉你的應用。這會使得你的應用給別人一個不好的印象。
注意:如果你同時有很多HTTP調用,你應該考慮創建一個單獨的線程來處理異步調用,從而避免在主線程上調用沖突。 |
Idle-Time Notifications 空閑通知
有些事情你只想在系統空閑的時候做。例如,你想要從iPhone發送反饋到服務器上,而你又不想在其他處理正在進行或其他用戶正在和設備交互的時候發送。你只想在用戶或設備沒事可做的時候發送。如果是你自己的話,這確實是一個很難的事情。不過高興的是,蘋果已經提供了一個函數來處理了。你可以通過NSNotificationQueue 使用 NSPostWhenIdle類型 來post一個通知,像下面的代碼:
你可以看到,它就像使用NSNotificationCenter那樣來使用;你添加一個對象和方法作為觀察者和selector。然后你可以post一個新的通知到隊列中,這樣方法就會在系統空閑的時候進行處理。
iPhone線程測試
線程的測試在第二章已經討論過了,所以圖6-13只是一個簡單的溫習。
這個測試并沒有提供太多的信息,除了應用中當前線程的狀態。這個能夠幫助你了解系統是否因為使用太多線程導致負荷過重,或線程掛起和等待太長時間,這是死鎖的一個征兆。
總結
在本章,你學到了如何使用多線程來提升你應用的性能。概念實際上是非常簡單的:你創建一個新的線程來處理一些計算。但是,為了使得你的應用正確和安全的運行,你需要注意很多細節。你同樣需要知道cpu密集型任務和IO密集型任務,來確保什么會導致性能提升,或使得性能下降。你學到了如何用不同的方法創建,管理,運行線程。你同樣學到了使用鎖的objective-c風格和它的語法,線程同步的問題,這個實際上是非常重要的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。