ios - DISPATCH_QUEUE_SERIAL串行队列的问题

查看:503
本文介绍了ios - DISPATCH_QUEUE_SERIAL串行队列的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

完整代码如下:

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,weak) NSTimer *timer;
@property (nonatomic,strong) dispatch_queue_t queue;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _queue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
    NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(addObjectforArray) userInfo:nil repeats:YES];
    [timer fire];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
       dispatch_async(_queue, ^{
       NSLog(@"touchesBeganThread:%@",[NSThread currentThread]);

    });
}

- (void)addObjectforArray{
    dispatch_async(_queue, ^{
        NSLog(@"addObjectThread:%@",[NSThread currentThread]);
    });

}

问题如下:
使用串行队列,又使用了 dispatch_async,在touchesBegan 和addObjectforArray里面打印出来的队列应该是同一个线程,但是实际情况却是

2017-08-09 10:33:25.984 nsmutableArrayTest[2734:232067] addObjectThread:<NSThread: 0x6000002626c0>{number = 6, name = (null)}
2017-08-09 10:33:25.994 nsmutableArrayTest[2734:232067] addObjectThread:<NSThread: 0x6000002626c0>{number = 6, name = (null)}
2017-08-09 10:33:25.998 nsmutableArrayTest[2734:232067] touchesBeganThread:<NSThread: 0x6000002626c0>{number = 6, name = (null)}
2017-08-09 10:33:26.004 nsmutableArrayTest[2734:232053] addObjectThread:<NSThread: 0x600000262480>{number = 5, name = (null)}
2017-08-09 10:33:26.014 nsmutableArrayTest[2734:232053] addObjectThread:<NSThread: 0x600000262480>{number = 5, name = (null)}

你如何看待这个问题,为什么number 会变化,不应该是开了多个线程,还是怎么回事?

解决方案

可以看下我的这篇博客,或者直接看下面的评论。

队列决定了是并行还是串行,同步异步决定了是否开启新的线程:

并发队列 串行队列(非主队列) 主队列(只有主线程,串行队列)
同步 不开启新的线程,串行 不开启新的线程,串行 不开启新的线程,串行
异步 开启新的线程,并发 开启新的线程,串行 不开启新的线程,串行

所以,即便你是串行队列,但是是异步执行,所以会启用新的线程。

这篇关于ios - DISPATCH_QUEUE_SERIAL串行队列的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆