1.NSThread NSOperation,GCD發(fā)展的歷程是從早到晚的,NSThread是比較輕量級(jí)的,NSOperation是對(duì)GCD的封裝,GCD比較簡單易用,也是蘋果比較提倡和推薦的一種方式
2.NSThread控制線程的狀態(tài)比較復(fù)雜,NSThead的創(chuàng)建主要有兩種方式:
- (instancetype)init NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument NS_AVAILABLE(10_5, 2_0);
當(dāng)然,還有一種比較特殊,就是使用所謂的convenient method,這個(gè)方法可以直接生成一個(gè)線程并啟動(dòng)它,而且無需為線程的清理負(fù)責(zé)。這個(gè)方法的接口是:
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
前兩種方法創(chuàng)建后,需要手機(jī)啟動(dòng),啟動(dòng)的方法是:
- (void)start;
3.NSOperation有一個(gè)“線程池”(NSOperationQueue)的概念,他可以設(shè)置最大線程數(shù)和線程彼此間的依賴的關(guān)系,比較容易控制優(yōu)先級(jí)。
使用NSOperation?類的方式有3種:
(1)NSInvocationOperation
(2)NSBlockOperation
(3)自定義子類繼承NSOperation,實(shí)現(xiàn)內(nèi)部相應(yīng)的?法
注意:操作對(duì)象默認(rèn)在主線程中執(zhí)行,只有添加到隊(duì)列中才會(huì)開啟新的線程。即默認(rèn)情況下,如果操作沒有放到隊(duì)列中queue中,都是同步執(zhí)行。只有將NSOperation放到一個(gè)NSOperationQueue中,才會(huì)異步執(zhí)行操作
4.GCD有一個(gè)類似NSOperationQueue的隊(duì)列dispatch_queue_t,GCD中的隊(duì)列分為串行和并行隊(duì)列
串行隊(duì)列:只有一個(gè)線程,加入到隊(duì)列中的操作按添加順序依次執(zhí)行
dispatch_queue_t queue_s = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
并行隊(duì)列:有多個(gè)線程,操作進(jìn)來之后它會(huì)將這些隊(duì)列安排在可用的處理器上,同時(shí)保證先進(jìn)來的任務(wù)優(yōu)先處理。
dispatch_queue_t queue = dispatch_queue_create("com.gcd-group.www", DISPATCH_QUEUE_CONCURRENT);
GCD還有一個(gè)隊(duì)列組dispatch_group_t
dispatch_group_t group = dispatch_group_create();
舉例:
通過一個(gè)并發(fā)的隊(duì)列創(chuàng)建一個(gè)隊(duì)列組
dispatch_queue_t queue = dispatch_queue_create("com.gcd-group.www", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
for (int i = 0; i < 10; i++) {
//? ? ? ? ? ? if (i == 9) {
? ? ? ? ? ? ? ? ? ? NSLog(@"11111111");
//? ? ? ? ? ? }
}
});
dispatch_group_leave(group); //所有的11111111都打印完成后,執(zhí)行其他異步隊(duì)列組線程隊(duì)列
dispatch_group_async(group, queue, ^{
NSLog(@"22222222");
});
dispatch_group_async(group, queue, ^{
NSLog(@"33333333");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"done");
});