iOS多线程-同步任务

2018-08-10  本文已影响246人  Rijkaa

同步任何的作用:

在开发中,通常会将耗时操作放后台执行,有的时候,有些任何彼此有依赖关系!

例子:登录、支付、下载

在队列里,依赖执行同一时间。

-(void)gcdDemo5{

    //创建一个异步队列
    dispatch_queue_t q = dispatch_queue_create("cc_queue2",DISPATCH_QUEUE_CONCURRENT);
    //1.用户登录
    dispatch_sync(q,^{
    NSLog(@"用户登录 %@",[NSThread currentThread]);
    });

    //2.支付
    dispatch_async(q,^{
    NSLog(@"支付 %@",[NSThread currentThread]);
    });

    //3.下载
    dispatch_async(q,^{
    NSLog(@"下载  %@",[NSThread currentThread]);
    });
}

步骤

增强版同步任务

-(void)gcdDemo6
{
    //队列
    dispatch_queue_t q = dispatch_queue_create("cc_queue",DISPATCH_QUEUE_CONCURRENT);

    //任务,在这个任务中添加了3个任务
    void (^task)() = ^{

        //1.用户登录
    dispatch_async(q,^{
    NSLog(@"用户登录 %@",[NSThread currentThread]);
    });

    //2.支付
    dispatch_async(q,^{
    NSLog(@"支付 %@",[NSThread currentThread]);
    });

    //3.下载
    dispatch_async(q,^{
    NSLog(@"下载  %@",[NSThread currentThread]);
    }); 
    };

    for(int i = 0; i < 10; i++)
    {
        NSLog(@"%d %@",i,[NSThread currentThread]);
    }

    //将task 丢到异步执行中去。
    dispatch_async(q,task);
    NLog(@"come here");
}

同步任务,不会取线程。但是如果这个任务本身就是在子线程上跑的了?
代码分析:

结论:从添加任务task 到 登录、支付、下载都是在子线程上操作的。不会造成主线程阻塞!

思考:
1.用户登录是在主线程还是子线程?
登录、下载、支付都在子线程
2.执行顺序是什么?
先执行“登录”,支付和下载不确定先后;
3.come here什么时候执行?
立马执行!靠前。因为come here在主线程
4.for 循环执行位置是什么?
与添加任务同级别。task会顺序执行。

小结:
可以队列调度多个任务前,指定一个同步任务,让所有的异步任务,等待同步任务执行完成。这就是依赖关系。
同步任务,会造成一个🔐

上一篇 下一篇

猜你喜欢

热点阅读