91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

iOS使用多線程提高數據并發訪問 之四

發布時間:2020-06-25 07:12:35 來源:網絡 閱讀:1235 作者:iKingLai 欄目:移動開發

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


NSInvocationOperation


當一個新的NSInvocationOperation對象創建時,它是用來運行指定的一個方法。你可能會想要使用這個對象,如果

  • 在你的應用中你想避免創建過多的自定義operation類。

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

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


創建一個NSInvocationOperation對象的代碼如下:


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

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


這個和使用NSThread創建和detach一個新的線程類似。你傳遞一個目標對象,你想要調用的selector,還有在執行時selector想要使用的參數。


NSBlockOperation


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


創建一個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,你可以使用兩種推薦的方法來創建。

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

       

   - (id)initWithData:(id)data {

           if ((self = [super init]))

               myData = data;              

           return self;

       }


  • main方法:這是一個必須的方法,當任務啟動時被調用。


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

  • start或main:你需要重寫這個方法或main方法,當線程啟動你的operations時,能夠執行你的邏輯。默認,這個方法沒有做任何事情,除了調用main方法。因此,你可以重寫這個方法或main方法。

  • isExecuting或isFinished:你的operation需要報告它當前的狀態給外面的客戶端。有兩個最重要的狀態就是:你的operation已經開始執行,你的operation已經執行完畢。因此你需要在這里通過使用屬性或實例變量來跟蹤和報告這些狀態。

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


其他方法不是強制性的,但是你可能經常會需要他們。

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


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


iOS使用多線程提高數據并發訪問 之四

iOS使用多線程提高數據并發訪問 之四

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


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



配置一個線程


你可以使用一些選項來配置你的線程,這樣你就可以使用系統資源而不需要重載他們,尤其是在受限的運行時環境中,比如iPhone。

  • 棧的大小:無論何時創建一個線程,OS會給線程的棧分配一個默認大小的內存來執行。如果你不知道棧是什么,你可以查看第5章。線程內部的棧會保存局部變量和線程執行時的方法。為了設置線程的棧大小,你需要在detaching線程之前設置。對于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


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

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



向AI問一下細節

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

AI

安阳市| 齐齐哈尔市| 汕尾市| 达尔| 唐河县| 开阳县| 弥勒县| 新和县| 靖远县| 金山区| 友谊县| 宾川县| 宜宾市| 凤台县| 眉山市| 莱西市| 比如县| 砀山县| 延川县| 铁岭市| 万宁市| 汉沽区| 胶州市| 潞西市| 基隆市| 清苑县| 郑州市| 余干县| 英山县| 九江县| 会同县| 宿州市| 新巴尔虎左旗| 大英县| 永仁县| 墨脱县| 兴义市| 班玛县| 怀化市| 蒙城县| 同仁县|