iOS整理 多執行緒之 NSOperation

2021-07-05 04:46:08 字數 3860 閱讀 7610

nsoperation的作用

配合使用nsoperation和nsoperationqueue也能實現多執行緒程式設計

nsoperation和nsoperationqueue實現多執行緒的具體步驟:

先將需要執行的操作封裝到乙個nsoperation物件中

然後將nsoperation物件新增到nsoperationqueue中

系統會自動將nsoperationqueue中的nsoperation取出來

將取出的nsoperation封裝的操作放到一條新執行緒中執行

nsoperation是個抽象類,並不具備封裝操作的能力,必須使用它的子類

使用nsoperation子類的方式有3種:

nsinvocationoperation

nsblockoperation

自定義子類繼承nsoperation,實現內部相應的方法

nsinvocationoperation

建立nsinvocationoperation物件

-(id)initwithtarget:(id)target selector:(sel)sel object:(id)arg;

呼叫start方法開始執行操作

-(void)start;

一旦執行操作,就會呼叫target的sel方法

注意:預設情況下,呼叫了start方法後並不會開一條新執行緒去執行操作,而是在當前執行緒同步執行操作

只有將nsoperation放到乙個nsoperationqueue中,才會非同步執行

// 1.建立操作物件, 封裝要執行的任務

nsinvocationoperation *operation = [[nsinvocationoperation alloc] initwithtarget:self selector:@selector(download) object:nil];

// 2.執行操作(預設情況下, 如果操作沒有放到佇列queue中, 都是同步執行)

[operation start];

- (void)download

}

nsblockoperation

建立nsblockoperation物件 

+ (id)blockoperationwithblock:(void (^)(void))block;

通過addexecutionblock:方法新增更多的操作

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

- 注意:只要nsblockoperation封裝的運算元 > 1,就會非同步執行操作

//  1.封裝操作

nsblockoperation *operation = [[nsblockoperation alloc] init];

[operation addexecutionblock:^];

[operation addexecutionblock:^];

[operation addexecutionblock:^];

// 2.執行操作

[operation start];

自定義nsoperation

自定義nsoperation的步驟: (了解基本流程)

重寫- (void)main方法,在裡面實現想執行的任務

重寫- (void)main方法的注意點:

自己建立自動釋放池(因為如果是非同步操作,無法訪問主線程的自動釋放池)

經常通過- (bool)iscancelled方法檢測操作是否被取消,對取消做出響應

nsoperationqueue

nsoperationqueue的作用:

nsoperation可以呼叫start方法來執行任務,但預設是同步執行的 如果將nsoperation新增到nsoperationqueue(操作佇列)中,系統會自動非同步執行nsoperation中的操作

新增操作到nsoperationqueue中:

- (void)addoperation:(nsoperation *)op;

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

最大併發數: 同時執行的任務數 比如,同時開3個執行緒執行3個任務,併發數就是3

最大併發數的相關方法:

- (nsinteger)maxconcurrentoperationcount;

- (void)setmaxconcurrentoperationcount:(nsinteger)cnt;

設定nsoperation在queue中的優先順序,可以改變操作的執行優先順序

-(nsoperationqueuepriority)queuepriority;

-(void)setqueuepriority:(nsoperationqueuepriority)p;

優先順序的取值

nsoperationqueuepriorityverylow = -8l,

nsoperationqueueprioritylow = -4l,

nsoperationqueueprioritynormal = 0,

nsoperationqueuepriorityhigh = 4,

nsoperationqueuepriorityveryhigh = 8

取消佇列的所有操作:

-(void)cancelalloperations;

暫停和恢復佇列

-(void)setsuspended:(bool)b; //

yes代表暫停佇列,no代表恢復佇列

-(bool)issuspended;

下面是**實現:

#import "viewcontroller.h"

@inte***ce

viewcontroller ()

@end

@implementation

viewcontroller

- (void)viewdidload

}];// 建立佇列

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

// 設定最大併發數 (通常最大併發數2~3)

queue.maxconcurrentoperationcount = 2;

// 設定操作依賴,為了操作有序進行 執行順序: opration > invocationop2 > invocationop1

[invocationop1 adddependency:invocationop2];

[invocationop2 adddependency:opration];

// 將操作新增到佇列中(自動執行,自動開啟執行緒)

[queue addoperation:invocationop1];

[queue addoperation:invocationop2];

[queue addoperation:opration];

}#pragma mark - 監聽方法

- (void)download

}- (void)run

}@end

iOS多執行緒之NSThread

ios多執行緒之nsthread 乙個nsthread物件就代表一條執行緒 1.建立,啟動執行緒 nsthread thread nsthread alloc initwithtarget self selector selector run object nil thread start 主線程相...

iOS多執行緒之NSThread

1.建立和啟動執行緒 nsthread thread nsthread alloc initwithtarget self selector selector run object nil thread start nsthread mainthread 獲得主線程 bool ismainthrea...

iOS 多執行緒之NSOperation

nsoperation 一一 基礎使用 implementation viewcontroller pragma mark 懶載入 nsoperationqueue quque return quque pragma mark 基本概念 1.兩個核心概念 a.操作 nsoperation 想要做的事...