今天先聊一聊最簡單的并發隊列,閑話不多說上代碼
- (void)viewDidLoad {
[super viewDidLoad];
//主隊列
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[mainQueue addOperationWithBlock:^{
for (int i = 0; i < 10; i ++) {
NSLog(@"mainQueue :%d",i);
}
}];
//并發隊列 同步執行
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1;
queue.suspended = YES;
[queue addOperationWithBlock:^{
for (int i = 0; i < 50; i ++) {
NSLog(@"queue :%d",i);
}
}];
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation) object:nil];
[queue addOperation:operation1];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0 ; i < 30 ; i ++) {
NSLog(@"operation2 : %d",i);
}
}];
[queue addOperation:operation2];
//2依賴與1,1先執行 1執行完了在是2
[operation2 addDependency:operation1];
queue.suspended = NO;
for (int i = 0; i < 40; i ++) {
NSLog(@"viewDidLoad :%d",i);
}
}
- (void)operation {
for (int i = 0 ; i < 50; i ++) {
NSLog(@"operation1 : %d",i);
}
}
我創建了一個主隊列,用兩種方法添加了兩個并發隊列
運行打印出來的結果如下圖
屏幕快照 2017-02-21 上午11.26.08.png
可以清楚的看到,queue和viewDidLoad是同時進行的,之后當queue結束了執行operation1,又因為operation1依賴于operation2,依次執行。設置了最大的并發數為1是為了讓程序更為清晰的顯示,我畫個圖來做個說明。
屏幕快照 2017-02-21 上午11.37.34.png
因為打印設置的循環的值設置的不一樣,以圖片的長度來代表下執行所需要的時間。可能文字的表述不是很精確,類比下銀行排隊,線程相當于不同的窗口,張三李四同時進入銀行辦理業務兩個窗口同時開放所以兩人可以同時進行,后來來了王五,因為就只有兩個窗口,王五不得不排隊。
關于主線程的應用最直觀的就在于刷新界面上,大家都知道刷新界面必須放在主線程中進行,那么不把刷新動作放在主線程會出現什么問題呢?我測試了下也不是說界面不會顯示,顯示也是會顯示,但會出現有時界面出現,有時界面沒有加載的情況。有興趣的小伙伴可以去嘗試下,另外最后大家可以將viewDidLoad的打印位置換一換看看打印出來的效果有什么不同,這是為了什么?關于隊列相關的這幾天我都會整理下,大家有興趣的可以一起來討論下。