溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之十

發(fā)布時間:2020-08-11 03:41:19 來源:網(wǎng)絡 閱讀:1669 作者:iKingLai 欄目:移動開發(fā)

線程的可選方案


有時候,你不想繼承threads或不想自己創(chuàng)建和管理單獨的線程。例如,你想要一個定時器每2秒鐘調(diào)用你的方法,你可能會寫一個線程一直循環(huán),然后睡眠2秒,然后調(diào)用你的方法?;蛘吣憧赡芟胍獙懘a處理異步請求,比如從網(wǎng)絡上下載文件?;蛘弋斈愕膇Phone空閑時,你想要繼續(xù)進行重量級的計算處理。這些都不太容易實現(xiàn)或者可能會降低性能。我會討論一些解決的辦法。


NSTimer


NSTimer并不承諾會很精確;如果你設置每0.5秒觸發(fā)一次,實際上定時器觸發(fā)的時間可能在0.55和0.6秒之間。但是,如果你只是想相對準確的執(zhí)行周期性任務的話,這是一個很好的機制。


重復和非重復NSTimer比較


你可以執(zhí)行重復或非重復的定時器。對于重復的定時器來說,定時器會在你指定的時間間隔內(nèi)觸發(fā),不會停止。如果你想停止的話,你需要手工的使定時器無效。對于非重復定時器來說,它只會觸發(fā)一次,然后會自動的變?yōu)闊o效。對這兩種情況,一旦定時器無效了,你不能在重用它;你必須重新創(chuàng)建一個定時器對象。


要創(chuàng)建一個定時器,你可以使用:


+ scheduledTimerWithTimeInterval:target:selector:userInfo: repeats:


或使用:


+ timerWithTimeInterval:target:selector:userInfo:repeats:


第一種方法會創(chuàng)建一個新的定時器,然后添加到當前的run loop中,然后返回定時器對象給你。第二種方法僅僅創(chuàng)建一個定時器對象;你需要自己通過調(diào)用[aTimer addTimer: forMethod]來添加到你自己的run loop中。


當時候重復定時器時,如果你要使定時器變成無效的話,你需要調(diào)用方法:[aTimer invalidate];



注意:在一個沒有run loop的線程中,NSTimer是不能工作的。



異步函數(shù)


在很多情況下,異步函數(shù)比線程更輕量級。例如,iPhone環(huán)境能夠從線程池中重用線程來處理異步函數(shù)。更進一步,如果你需要處理100個異步函數(shù),OS可能只需要10個線程,因為一個線程能夠處理多個異步函數(shù)。唯一的問題就是,它比你創(chuàng)建一些線程和一個異步請求來處理他們看起來更復雜。


Listing 6-9 代碼塊創(chuàng)建了一個異步請求到服務器上,然后合并返回的結果創(chuàng)建一個數(shù)據(jù)對象。


iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之十

iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之十


相比,使用簡單的線程和異步函數(shù)處理方案:


  1. @autoreleasepool {
           NSData *p_w_picpathData = [NSData dataWithContentsOfURL:p_w_picpathURL];

    }


在某些情況下,你可能需要寫更多的代碼來獲得更好的性能。你僅僅需要確保實際上做的什么將對你有利。


如果你使用異步HTTP請求,你需要運行在一個后臺線程中。如果很長一段時間都沒有響應,iOS的策略可能會殺掉你的應用。這會使得你的應用給別人一個不好的印象。



注意:如果你同時有很多HTTP調(diào)用,你應該考慮創(chuàng)建一個單獨的線程來處理異步調(diào)用,從而避免在主線程上調(diào)用沖突。



Idle-Time Notifications 空閑通知


有些事情你只想在系統(tǒng)空閑的時候做。例如,你想要從iPhone發(fā)送反饋到服務器上,而你又不想在其他處理正在進行或其他用戶正在和設備交互的時候發(fā)送。你只想在用戶或設備沒事可做的時候發(fā)送。如果是你自己的話,這確實是一個很難的事情。不過高興的是,蘋果已經(jīng)提供了一個函數(shù)來處理了。你可以通過NSNotificationQueue 使用 NSPostWhenIdle類型 來post一個通知,像下面的代碼:


iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之十

iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之十


你可以看到,它就像使用NSNotificationCenter那樣來使用;你添加一個對象和方法作為觀察者和selector。然后你可以post一個新的通知到隊列中,這樣方法就會在系統(tǒng)空閑的時候進行處理。


iPhone線程測試


線程的測試在第二章已經(jīng)討論過了,所以圖6-13只是一個簡單的溫習。


iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之十


這個測試并沒有提供太多的信息,除了應用中當前線程的狀態(tài)。這個能夠幫助你了解系統(tǒng)是否因為使用太多線程導致負荷過重,或線程掛起和等待太長時間,這是死鎖的一個征兆。


總結


在本章,你學到了如何使用多線程來提升你應用的性能。概念實際上是非常簡單的:你創(chuàng)建一個新的線程來處理一些計算。但是,為了使得你的應用正確和安全的運行,你需要注意很多細節(jié)。你同樣需要知道cpu密集型任務和IO密集型任務,來確保什么會導致性能提升,或使得性能下降。你學到了如何用不同的方法創(chuàng)建,管理,運行線程。你同樣學到了使用鎖的objective-c風格和它的語法,線程同步的問題,這個實際上是非常重要的。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI