iOS 多執行緒筆記

2021-09-24 07:12:46 字數 4571 閱讀 5642

同步函式

dispatch_sync(queue, ^);

複製**

非同步函式,具有開啟執行緒的能力

dispatch_async(queue, ^);

複製**

序列佇列,任務序列執行

dispatch_queue_t queue = dispatch_queue_create("queueid", dispatch_queue_serial);

複製**

並行佇列,任務可併發執行

dispatch_queue_t queue = dispatch_queue_create("queueid", dispatch_queue_concurrent);

複製**

全域性併發佇列

dispatch_get_global_queue(dispatch_queue_priority_default, 0);

複製**

主佇列

dispatch_queue_t queue =  dispatch_get_main_queue();

複製**

任務併發執行必須併發佇列 + 非同步函式

dispatch_get_global_queue(dispatch_queue_priority_default, 0);

// 或者

//dispatch_queue_t queue = dispatch_queue_create("queueid", dispatch_queue_concurrent);

dispatch_sync(queue, ^);

dispatch_sync(queue, ^);

dispatch_sync(queue, ^);

複製**

佇列組:多個任務執行完成再做其他操作。

//建立佇列組

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^);

dispatch_group_async(group, queue, ^);

//合成

dispatch_group_notify(group, queue, ^);

});複製**

快速迭代

// 執行10次**,index順序不確定

});複製**

柵欄函式:等柵欄函式前的任務執行完再執行後面的任務

//1.建立佇列(併發佇列)

dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", dispatch_queue_concurrent);

dispatch_async(queue, ^

});

dispatch_async(queue, ^

});

//柵欄函式

dispatch_barrier_async(queue, ^);

dispatch_async(queue, ^

});

dispatch_async(queue, ^

});複製**

// nsinvocationoperation

/* 第乙個引數:目標物件

第二個引數:該操作要呼叫的方法,最多接受乙個引數

第三個引數:呼叫方法傳遞的引數,如果方法不接受引數,那麼該值傳nil

*/nsinvocationoperation *operation = [[nsinvocationoperation alloc]

initwithtarget:self selector:@selector(run) object:nil];

//2.啟動操作

[operation start];

// nsblockoperation

nsblockoperation *operation = [nsblockoperation blockoperationwithblock:^];

//2.追加操作,追加的操作在子執行緒中執行

[operation addexecutionblock:^];

//3.啟動執行操作

[operation start];

複製**

預設情況下,呼叫例項物件的start方法並不會開啟新執行緒執行任務,而需要將其加入nsoperationqueue中。

//1.建立佇列

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

//2.封裝操作

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

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

//3.把封裝好的操作新增到佇列中

[queue addoperation:op1];//會自動執行[op1 start]

[queue addoperation:op2];

複製**

設定最大併發數

非主佇列中的任務預設是併發執行的,可以通過設定佇列的最大併發數來控制該佇列中的任務是併發執行還是序列執行的.

當最大併發數==1 任務序列執行

當最大併發數》1 任務併發執行

系統預設的最大併發數 == -1 (預設是併發執行的)

當最大併發數 == 0 不會執行任務操作

//0.建立佇列

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

queue.maxconcurrentoperationcount = 1;

複製**

取消佇列中的所有任務

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

[queue cancelalloperations];

複製**

佇列的暫停和恢復

暫停佇列的時候,不能暫停當前正在執行的任務,當前任務還是會繼續執行完,但是下乙個任務將不會執行。

暫停操作是可以恢復的。

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

// 暫停

queue.suspended = yes;

// 恢復

queue.suspended = no;

複製**

操作依賴:操作a執行完後,才能執行操作b

//1.建立佇列

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

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

nsblockoperation *op1 = [nsblockoperation blockoperationwithblock:^];

nsblockoperation *op2 = [nsblockoperation blockoperationwithblock:^];

//操作監聽,當對應的任務執行完畢後,可以在block裡面執行相關的掃尾操作

op2.completionblock = ^;

nsblockoperation *op01 = [nsblockoperation blockoperationwithblock:^];

nsblockoperation *op02 = [nsblockoperation blockoperationwithblock:^];

[op1 adddependency:op2];

//跨佇列依賴

[op1 adddependency:op01];

[op02 adddependency:op1];

// 新增操作到相應的佇列

[queue addoperation:op1];

[queue addoperation:op2];

[queueother addoperation:op01];

[queueother addoperation:op02];

複製**

iOS多執行緒

iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...

iOS多執行緒

iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...

iOS多執行緒

iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...