多線程分為GCD,NSOperation和NSThread。GCD底層是用C語(yǔ)言實(shí)現(xiàn)的,NSOperation是對(duì)GCD輕量級(jí)的封裝。NSThread是比較原始的方法了。
1、GCD創(chuàng)建多線程
首先,我們需要?jiǎng)?chuàng)建一個(gè)隊(duì)列,隊(duì)列根據(jù)不同的需要?jiǎng)?chuàng)建為串行隊(duì)列和并行隊(duì)列
dispatch_queue_t ?q = dispatch_queue_create("xiancheng",DISPATCH_QUEUE_CONCURRENT)
函數(shù)中第一個(gè)參數(shù)是當(dāng)前隊(duì)列的名稱,第二個(gè)參數(shù)是創(chuàng)建隊(duì)列的類型:DISPATCH_QUEUE_CONCURRENT為并行隊(duì)列,DISPATCH_QUEUE_SERIAL為串行隊(duì)列。
另外,隊(duì)列還有主隊(duì)列和全局隊(duì)列。
主隊(duì)列:dispatch_queue_t ?queue = ?dispatch_get_main_queue();獲取主線程隊(duì)列,在主線程更新UI。
全局隊(duì)列:dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
接下來(lái)我們可以使用dispatch_async或dispatch_sync函數(shù)來(lái)加載需要運(yùn)行的任務(wù)。
同步線程:
dispatch_sync(queue,^{
block的具體代碼(即需要執(zhí)行的任務(wù))
});
同步執(zhí)行任務(wù)代碼,不會(huì)返回函數(shù),知道block中的代碼執(zhí)行完畢。嵌套使用時(shí)容易引起死鎖。
異步線程:
dispatch_async(queue,^{
block中的任務(wù)代碼
});
異步執(zhí)行block,函數(shù)立即返回。
NSOperation:
同樣的,NSOperation需要一個(gè)隊(duì)列
在.m文件中,輸入以下內(nèi)容:
#import “ViewController.h”
@interface ViewController()
@property(noatomic,strong) NSOperationQueue *myQueue;
@end
@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
初始化隊(duì)列
self.myQueue = [[NSOperationQueue alloc] init];
}
創(chuàng)建一個(gè)線程
[self.myQueue addOperationWithBlock:^{
Block中的任務(wù)代碼
}]
在主線程中執(zhí)行任務(wù)
[NSOperationQueue mainQueue] addOperationWithBlock:^{
block中的任務(wù)代碼
}];
多個(gè)線程時(shí),設(shè)置線程的執(zhí)行順序
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
任務(wù)代碼
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
任務(wù)代碼
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
任務(wù)代碼
}];
假設(shè)我們需要線程的執(zhí)行順序?yàn)椋簅p1,op2,op3.
思想就是線程2依賴于線程1,等線程1執(zhí)行完畢后執(zhí)行線程2.
[op2 addDependency:op1];
[op3 addDependency:op2];
將線程依次添加到隊(duì)列中
[self.myQueue addOperation:op1]
[self.myQueue addOperation:op2]
[self.myQueue addOperation:op3]
@end