iOS開發多執行緒 NSOperation基本操作

2021-07-08 08:58:37 字數 3473 閱讀 5956

一、併發數

(1)併發數:同時執⾏行的任務數.比如,同時開3個執行緒執行3個任務,併發數就是3

(2)最大併發數:同一時間最多只能執行的任務的個數。

(3)最⼤大併發數的相關⽅方法

- (nsinteger)maxconcurrentoperationcount;

- (void)setmaxconcurrentoperationcount:(nsinteger)count;

說明:如果沒有設定最大併發數,那麼併發的個數是由系統記憶體和cpu決定的,可能記憶體多久開多一點,記憶體少就開少一點。

注意:num的值並不代表執行緒的個數,僅僅代表執行緒的id。

提示:最大併發數不要亂寫(5以內),不要開太多,一般以2~3為宜,因為雖然任務是在子執行緒進行處理的,但是cpu處理這些過多的子執行緒可能會影響ui,讓ui變卡。

二、佇列的取消,暫停和恢復

(1)取消佇列的所有操作

- (void)cancelalloperations;
提⽰:也可以呼叫nsoperation的- (void)cancel⽅法取消單個操作

(2)暫停和恢復佇列

- (void)setsuspended:(bool)b; // yes代表暫停佇列,no代表恢復佇列

- (bool)issuspended; //當前狀態

三、操作優先順序

(1)設定nsoperation在queue中的優先順序,可以改變操作的執⾏優先順序

- (nsoperationqueuepriority)queuepriority;

- (void)setqueuepriority:(nsoperationqueuepriority)priority;

(2)優先順序的取值

nsoperationqueuepriorityverylow = -8l,

nsoperationqueueprioritylow = -4l,

nsoperationqueueprioritynormal = 0,

nsoperationqueuepriorityhigh = 4,

nsoperationqueuepriorityveryhigh = 8

說明:優先順序高的任務,呼叫的機率會更大。

四、操作依賴

(1)nsoperation之間可以設定依賴來保證執行順序,⽐如一定要讓操作a執行完後,才能執行操作b,可以像下面這麼寫

[operationb adddependency:operationa]; // 操作b依賴於操作
(2)可以在不同queue的nsoperation之間建立依賴關係

注意:不能迴圈依賴(不能a依賴於b,b又依賴於a)。

(3)**示例

#import "viewcontroller.h"

@inte***ce viewcontroller ()

@end

@implementation viewcontroller

- (void)viewdidload

}];[operation3 addexecutionblock:^

}];// 設定操作依賴

// 先執行operation2, 再執行operation1, 最後執行operation3

[operation3 adddependency:operation1];

[operation1 adddependency:operation2];

// 不能是相互依賴

// [operation3 adddependency:operation1];

// [operation1 adddependency:operation3];

//把操作新增到佇列中

[queue addoperation:operation1];

[queue addoperation:operation2];

[queue addoperation:operation3];

}- (void)run1

}- (void)run2

}@end

列印檢視:

a做完再做b,b做完才做c。

注意:一定要在新增之前,進行設定。

提示:任務新增的順序並不能夠決定執行順序,執行的順序取決於依賴。使用operation的目的就是為了讓開發人員不再關心執行緒。

5.操作的監聽

可以監聽乙個操作的執行完畢

- (void (^)(void))completionblock;

- (void)setcompletionblock:(void (^)(void))block;

**示例

#import "viewcontroller.h"

@inte***ce viewcontroller ()

@end

@implementation viewcontroller

- (void)viewdidload ];

// 建立佇列

nsoperationqueue *queue = [[nsoperationqueue alloc] init];

// 將任務新增到佇列中(自動執行,自動開執行緒)

[queue addoperation:operation];

}@end

第二種方式:

#import "viewcontroller.h"

@inte***ce viewcontroller ()

@end

@implementation viewcontroller

- (void)viewdidload

}];// 監聽操作的執行完畢

operation.completionblock = ^;

// 建立佇列

nsoperationqueue *queue = [[nsoperationqueue alloc] init];

// 將任務新增到佇列中(自動執行,自動開執行緒)

[queue addoperation:operation];

}@end

列印檢視:

說明:在上乙個任務執行完後,會執行operation.completionblock=^{}**段,且是在當前執行緒執行(2)。

iOS開發多執行緒 執行緒安全

資源共享 1塊資源可能會被多個執行緒共享,也就是多個執行緒可能會訪問同一塊資源 比如多個執行緒訪問同乙個物件 同乙個變數 同乙個檔案 當多個執行緒訪問同一塊資源時,很容易引發資料錯亂和資料安全問題 示例一 示例二 問題 import viewcontroller.h inte ce viewcont...

iOS開發 多執行緒篇 多執行緒介紹

一 程序和執行緒 1 什麼是程序 程序是指在系統中正在執行的乙個應用程式 每個程序之間是獨立的,每個程序均執行在其專用且受保護的記憶體空間內 比如同時開啟迅雷 xcode,系統就會分別啟動2個程序 通過 活動監視器 可以檢視mac系統中所開啟的程序 3 執行緒的序列 1個執行緒中任務的執行是序列的 ...

iOS開發 多執行緒簡介

多執行緒從概念上理解是指從軟體或者硬體上實現多個執行緒併發執行的技術,簡單點理解就是同一時間可以執行多個事情 比如說一邊聽歌一邊碼 聽歌是乙個執行緒,碼 是乙個執行緒,如果是單核cpu的話,上面兩個動作其實可以確切的理解為併發,也就是偽並行,只是兩者相差的時間太快沒有察覺。電腦現在一般都是雙核的或者...