溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS如何使用多線程提升數(shù)據(jù)并發(fā)訪問

發(fā)布時(shí)間:2021-10-21 10:13:20 來源:億速云 閱讀:172 作者:小新 欄目:移動(dòng)開發(fā)

這篇文章主要介紹iOS如何使用多線程提升數(shù)據(jù)并發(fā)訪問,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

第一個(gè)例子

這個(gè)例子演示了IO性能方面的一些問題。稍后我會(huì)通過多線程技術(shù)來加速代碼的執(zhí)行效率。我的例子很簡單:

  • 在第一個(gè)測試中,我會(huì)在一個(gè)table view中加載和顯示一序列圖片。然后,我會(huì)向你演示滾動(dòng)性能時(shí)的問題:你不能滾動(dòng)表格直到當(dāng)前狀態(tài)的所有圖片全部返回。

  • 在第二個(gè)測試中,我會(huì)使用多線程加速程序的執(zhí)行。你會(huì)看到,當(dāng)你在等待圖片加載時(shí),滾動(dòng)性能將變得更好。


注意:對(duì)于這兩種情況,我的例子不會(huì)緩存圖片,這樣是為了讓你更清晰的看到這兩者的不同。


表格6-1展示的測試結(jié)果,是基于Core Animation測試的結(jié)果,你可以在一個(gè)真實(shí)的環(huán)境下看到應(yīng)用的測試結(jié)果。

iOS如何使用多線程提升數(shù)據(jù)并發(fā)訪問

表格6-1的是在iPhone OS上處理和運(yùn)行應(yīng)用中,加載時(shí)的fps。你可以看到多線程能夠顯著的加速加載的過程。在沒有使用多線程的情況中,加載過程會(huì)阻塞UI,你的應(yīng)用將會(huì)被掛起。

我將會(huì)給你看一下源代碼,在深入解釋概念之前我會(huì)做一些簡單的解釋。Listing 6-1 是第一個(gè)測試的原代碼。

Listing 6–1. First Benchmark; This Code Runs Inside the UITableViewDataSource’s Method.

- (UITableViewCell *)tableView:(UITableView *)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       static NSString *CellIdentifier = @"Cell";

       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

       if (cell == nil) {

               cell = [[UITableViewCell alloc]      initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier];

       }

       NSURL *p_w_picpathURL = [NSURL URLWithString:[self.p_w_picpathsArray objectAtIndex:indexPath.row]];

       cell.p_w_picpathView.p_w_picpath = [UIImage p_w_picpathWithData:[NSData     dataWithContentsOfURL:p_w_picpathURL]];

   // Configure the cell.

    return cell;

}

Listing 6-2 只是顯示了在異步代碼中返回圖片的通常做法。為了簡單起見,事實(shí)上異步代碼沒有在這邊顯示或討論。

Listing 6–2. Second Benchmark—Getting the Image Through a Background Thread

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath {

       static NSString *CellIdentifier = @"Cell";

       ImageCell *cell = (ImageCell *) [UIUtilities getCellWithTableView:tableViewcellIdentifier:CellIdentifiernibName:@"ImageCell"];

       // Configure the cell.

       NSURL *p_w_picpathURL = [NSURL URLWithString:[self.p_w_picpathsArrayobjectAtIndex:indexPath.row]];

       [cell.contentImage displayImageWithURL:p_w_picpathURL];

      return cell;

}

#import <Foundation/Foundation.h>#import "ImageFetcher.h"

@interface UIImageView (Network) <ImageFetcherDelegate>

       - (void)displayImageWithURL:(NSURL *)url;

@end

#import "UIImageView+Network.h"#import "ImageFetcher.h"

@implementation UIImageView (Network)

- (void)p_w_picpathFetcherFinished:(ImageFetcher *)fetcher {

       self.p_w_picpath = fetcher.p_w_picpath;

}

- (void)displayImageWithURL:(NSURL *)url {

       self.p_w_picpath = nil;
       if (url) {

           // This code will run in the background thread and callback when it retrieves// p_w_picpath
           [ImageFetcher loadImageWithURL:url delegate:self];

       }

}

@end

在第一個(gè)測試中,方法的內(nèi)部返回了table view的cell,我在這里獲取了圖片。對(duì)于這行代碼,iOS將會(huì)停止,然后等待圖片從網(wǎng)絡(luò)返回。之后,它繼續(xù)返回cell和把cell顯示給UI。這個(gè)等待過程使得應(yīng)用停止,這也就是在第一個(gè)測試中你不能快速滾動(dòng)table view的原因。

對(duì)于第二個(gè)測試,我使用了異步代碼,它是多線程的另一種形式,但是底層庫將會(huì)為你處理多線程代碼。通過這段代碼,主進(jìn)程從等待下載完成的進(jìn)程中解放出來。因此,在第二個(gè)測試中,你可以滾動(dòng)table view,而沒有任何問題。

多線程的好處

在iPhone應(yīng)用中,你一些情況你應(yīng)該考慮使用多線程。

  • 利用所有的內(nèi)核和處理器:(一個(gè)處理器總是有多個(gè)內(nèi)核,而內(nèi)核實(shí)際上是計(jì)算單元。)目前,iPhone 4 只有一個(gè)處理器和內(nèi)核,但是iPhone 5 可能會(huì)有更多的內(nèi)核,那么你將能夠利用所有可用的處理器來提升你應(yīng)用的性能。

  • 建模:你可能想嘗試從真實(shí)世界的行為中進(jìn)行建模。例如,考慮這么一種解決方案,你有12種不同類型的任務(wù)要做(解決bug,面試系統(tǒng)管理員,創(chuàng)建你的下一個(gè)產(chǎn)品演示幻燈片,等等),另外一種是只有一個(gè)復(fù)雜的任務(wù)(解決12個(gè)bug)。后一種解決方案很簡單,你只有一個(gè)工作隊(duì)列去完成。第一種情況是比較復(fù)雜的解決方案,你可以為每一個(gè)任務(wù)分配一個(gè)線程。

  • 處理IO任務(wù):通常,IO(網(wǎng)絡(luò)和文件)任務(wù)需要花費(fèi)時(shí)間來返回?cái)?shù)據(jù)給應(yīng)用。因此,如果你使用一個(gè)線程來處理,你的應(yīng)用會(huì)停止工作,花費(fèi)時(shí)間來等待數(shù)據(jù)。使用多線程可以幫助你把IO線程進(jìn)行分割,等它接收到所有數(shù)據(jù)之后在合并到主線程中。

  • 更靈敏的UI響應(yīng):所有d的GUI應(yīng)用,比如iPhone,啟動(dòng)的時(shí)候只有一個(gè)線程,意味著所有應(yīng)用的代碼都是通過main event loop(也叫著main run loop)來執(zhí)行的。event loop就是當(dāng)應(yīng)用收到用戶的輸入事件(比如,單擊,滑動(dòng),雙擊),然后會(huì)運(yùn)行這個(gè)輸入事件響應(yīng)的邏輯。應(yīng)用在event loop執(zhí)行的時(shí)間越長,UI反應(yīng)就越不靈敏。

  • 在后臺(tái)進(jìn)行一些邏輯處理:這同樣是iPhone應(yīng)用代碼中非常重要的一部分。在某些情況下你可能需要處理一些大數(shù)據(jù),比如運(yùn)行一個(gè)XML解析算法來解析數(shù)據(jù)。這同樣跟UI的響應(yīng)有關(guān):在UI線程做的工作越少,程序就會(huì)有越好的用戶體驗(yàn)。

以上是“iOS如何使用多線程提升數(shù)據(jù)并發(fā)訪問”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

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

ios
AI