今天先聊一聊最简单的并发队列,闲话不多说上代码
- (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);
}
}
我创建了一个主队列,用两种方法添加了两个并发队列
运行打印出来的结果如下图
可以清楚的看到,queue和viewDidLoad是同时进行的,之后当queue结束了执行operation1,又因为operation1依赖于operation2,依次执行。设置了最大的并发数为1是为了让程序更为清晰的显示,我画个图来做个说明。
因为打印设置的循环的值设置的不一样,以图片的长度来代表下执行所需要的时间。可能文字的表述不是很精确,类比下银行排队,线程相当于不同的窗口,张三李四同时进入银行办理业务两个窗口同时开放所以两人可以同时进行,后来来了王五,因为就只有两个窗口,王五不得不排队。
关于主线程的应用最直观的就在于刷新界面上,大家都知道刷新界面必须放在主线程中进行,那么不把刷新动作放在主线程会出现什么问题呢?我测试了下也不是说界面不会显示,显示也是会显示,但会出现有时界面出现,有时界面没有加载的情况。有兴趣的小伙伴可以去尝试下,另外最后大家可以将viewDidLoad的打印位置换一换看看打印出来的效果有什么不同,这是为了什么?关于队列相关的这几天我都会整理下,大家有兴趣的可以一起来讨论下。