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

線程的可選方案

浠水網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),浠水網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為浠水上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的浠水做網(wǎng)站的公司定做!

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

NSTimer

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

重復(fù)和非重復(fù)NSTimer比較

你可以執(zhí)行重復(fù)或非重復(fù)的定時器。對于重復(fù)的定時器來說,定時器會在你指定的時間間隔內(nèi)觸發(fā),不會停止。如果你想停止的話,你需要手工的使定時器無效。對于非重復(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中。

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

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

異步函數(shù)

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

Listing 6-9 代碼塊創(chuàng)建了一個異步請求到服務(wù)器上,然后合并返回的結(jié)果創(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請求,你需要運行在一個后臺線程中。如果很長一段時間都沒有響應(yīng),iOS的策略可能會殺掉你的應(yīng)用。這會使得你的應(yīng)用給別人一個不好的印象。

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

Idle-Time Notifications 空閑通知

有些事情你只想在系統(tǒng)空閑的時候做。例如,你想要從iPhone發(fā)送反饋到服務(wù)器上,而你又不想在其他處理正在進行或其他用戶正在和設(shè)備交互的時候發(fā)送。你只想在用戶或設(shè)備沒事可做的時候發(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只是一個簡單的溫習(xí)。

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

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

總結(jié)

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

網(wǎng)站名稱:iOS使用多線程提高數(shù)據(jù)并發(fā)訪問之十
鏈接URL:http://bm7419.com/article18/jcgodp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器營銷型網(wǎng)站建設(shè)、Google自適應(yīng)網(wǎng)站、服務(wù)器托管、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名