溫馨提示×

溫馨提示×

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

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

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

發(fā)布時間:2020-06-25 07:12:35 來源:網(wǎng)絡(luò) 閱讀:1227 作者:iKingLai 欄目:移動開發(fā)

現(xiàn)在,我將會向你更深入的介紹如何使用之前提到的方法來創(chuàng)建新的operations。


NSInvocationOperation


當(dāng)一個新的NSInvocationOperation對象創(chuàng)建時,它是用來運(yùn)行指定的一個方法。你可能會想要使用這個對象,如果

  • 在你的應(yīng)用中你想避免創(chuàng)建過多的自定義operation類。

  • 你正在添加或維護(hù)一個已經(jīng)存在的應(yīng)用,而它的類都已經(jīng)定義好了,同時你不想修改NSOperation的子類。

  • selector能夠根據(jù)用戶的輸入進(jìn)行改變。在這種情況下,你只需要用一個已經(jīng)選擇好的selector創(chuàng)建一個新的NSInvocationOperation對象。


創(chuàng)建一個NSInvocationOperation對象的代碼如下:


NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self

selector:@selector(myTaskMethod:) object:data];


這個和使用NSThread創(chuàng)建和detach一個新的線程類似。你傳遞一個目標(biāo)對象,你想要調(diào)用的selector,還有在執(zhí)行時selector想要使用的參數(shù)。


NSBlockOperation


NSBlockOperation是NSOperation的另一個子類。當(dāng)你創(chuàng)建一個block operation時,你必須在這個operation 對象內(nèi)至少添加一個block。之后你可以在這個operation對象內(nèi)添加更多的block來執(zhí)行。當(dāng)operation queue執(zhí)行這個block operation時,它會在這個block operation結(jié)束之前執(zhí)行這個block operation內(nèi)的所有blocks。因此,你可以使用這個operation對象來跟蹤一組blocks,然后你可以合并會處理相關(guān)結(jié)果。


創(chuàng)建一個block operation對象,你可以使用下面的代碼:


NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{

       NSLog(@"Beginning operation.\n");
       // Do some work.

}];


然后你可以在這個operation中添加另一個block:


[theOp addExecutionBlock:[NSBlockOperation blockOperationWithBlock: ^{

       NSLog(@"Beginning operation.\n");
       // Do some work.

}];


NSOperation


NSOperation是用來被繼承的一個類。要繼承NSOperation,你可以使用兩種推薦的方法來創(chuàng)建。

  • 自定義初始化方法:可以在這個類中接收數(shù)據(jù)和進(jìn)行一些必要的邏輯處理。例如,你可以在init方法中接收一個url來下載圖片,類似這樣:

       

   - (id)initWithData:(id)data {

           if ((self = [super init]))

               myData = data;              

           return self;

       }


  • main方法:這是一個必須的方法,當(dāng)任務(wù)啟動時被調(diào)用。


為了得到一個并發(fā)的NSOperation子類,你必須重寫更多的方法來幫助NSOperationQueue對象來處理調(diào)用者的多線程請求。

  • start或main:你需要重寫這個方法或main方法,當(dāng)線程啟動你的operations時,能夠執(zhí)行你的邏輯。默認(rèn),這個方法沒有做任何事情,除了調(diào)用main方法。因此,你可以重寫這個方法或main方法。

  • isExecuting或isFinished:你的operation需要報告它當(dāng)前的狀態(tài)給外面的客戶端。有兩個最重要的狀態(tài)就是:你的operation已經(jīng)開始執(zhí)行,你的operation已經(jīng)執(zhí)行完畢。因此你需要在這里通過使用屬性或?qū)嵗兞縼砀櫤蛨蟾孢@些狀態(tài)。

  • isConcurrent:你必須重寫這個方法,然后返回YES。


其他方法不是強(qiáng)制性的,但是你可能經(jīng)常會需要他們。

  • 其他邏輯處理方法:除非你想把所有的代碼都放在main方法中,你同樣需要其他的方法來包含你的邏輯處理代碼。


Listing 6-4 顯示了一個自定義和并發(fā)的NSOperation類的完整代碼。


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

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

Listing 6-4 展示了如何編寫一個自定義的NSOperation,使用多線程來從網(wǎng)絡(luò)下載一張圖片。


注意:如果你之前做過java編程,你會發(fā)現(xiàn)NSOperation和Thread類或Runnable接口很像。在Thread類中,你可以繼承Thread類,然后重寫run方法。對于Runnable接口也一樣,你需要實(shí)現(xiàn)Runnable接口,然后重寫run方法。你可以看到,NSoperation的main方法和Thread類,Runnable接口的run方法是一樣的。



配置一個線程


你可以使用一些選項(xiàng)來配置你的線程,這樣你就可以使用系統(tǒng)資源而不需要重載他們,尤其是在受限的運(yùn)行時環(huán)境中,比如iPhone。

  • 棧的大?。簾o論何時創(chuàng)建一個線程,OS會給線程的棧分配一個默認(rèn)大小的內(nèi)存來執(zhí)行。如果你不知道棧是什么,你可以查看第5章。線程內(nèi)部的棧會保存局部變量和線程執(zhí)行時的方法。為了設(shè)置線程的棧大小,你需要在detaching線程之前設(shè)置。對于NSThread,這意味著你要使用初始化方法:




NSThread* myThread = [[NSThread alloc]initWithTarget:self

selector:@selector(myThreadMainMethod:)object:nil];

[myThread setStackSize:40960]; // 40KB here, the size is in bytes and multiple of 4KB

[myThread start]; // Actually create the thread


  • 線程局部存儲:沒一個線程都有一個鍵值對的字典來存儲數(shù)據(jù),它能夠在線程內(nèi)部的任何地方訪問。你可以使用這個字典來存儲數(shù)據(jù),還可以垮線程來呈現(xiàn)數(shù)據(jù),而不需要在代碼中創(chuàng)建全局變量。你可以使用[aThread threadDictionary]來調(diào)用字典。

  • 線程優(yōu)先級:線程優(yōu)先級就是OS選擇哪個線程來執(zhí)行的可能性。優(yōu)先級越高,線程運(yùn)行的可能性就越大。但是,優(yōu)先級并不能向你保證任何事情,在OS切換到其他線程之前。它同樣不能保證一個高優(yōu)先級的線程總是被選中,相對于低優(yōu)先級的線程來說。



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

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

AI