美文网首页
细说苹果的多线程处理-GCD

细说苹果的多线程处理-GCD

作者: iOS小吴 | 来源:发表于2017-12-26 15:37 被阅读0次

    细说苹果的多线程处理-GCD

    GCD的工作原理:让程序平行排队的特定任务,根据看用的资源处理,安排他们在任何可用的处理器核心上执行任务。

    GCD的FIFO队列称为dispatch queue (分为三中)

    Serial(private dispatch queues) :只执行一个任务,Serial queue通常用于同步访问特定的资源或数据,当你创建多个Serial queue的时候,虽然他们是各自同步执行的,但Serial queue与Serial queue之间是并发执行的。

    Concurrent:(global dispatch queue)

    可以并发的执行多个任务,但是执行完成的顺序是随机的。

    Main dispatch queue :它是全局可用的serial queue,它是在应用程序主线程上执行任务的。

    1:  dispatch_async为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // 耗时的操作

        dispatch_async(dispatch_get_main_queue(), ^{

           // 更新界面

        });

    });

    举个例子:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"]; NSData * data = [[NSData alloc]initWithContentsOfURL:url]; UIImage *image = [[UIImage alloc]initWithData:data];

    if (data != nil) {(dispatch_get_main_queue(), ^{

    self.imageView.image = image;

       });

    } });

    2dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        dispatch_group_t group = dispatch_group_create();

        dispatch_group_async(group, queue, ^{

            [NSThread sleepForTimeInterval:1];

            NSLog(@"group1");

        });

        dispatch_group_async(group, queue, ^{

            [NSThread sleepForTimeInterval:2];

            NSLog(@"group2");

        });

        dispatch_group_async(group, queue, ^{

            [NSThread sleepForTimeInterval:3];

            NSLog(@"group3");

        });

        dispatch_group_notify(group, dispatch_get_main_queue(), ^{

            NSLog(@"updateUi");

        });

        dispatch_release(group);

    依次打印:group1 -group2- group3 -updateUi

    3:dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

    dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);

        dispatch_async(queue, ^{

            [NSThread sleepForTimeInterval:2];

            NSLog(@"dispatch_async1");

        });

        dispatch_async(queue, ^{

            [NSThread sleepForTimeInterval:4];

            NSLog(@"dispatch_async2");

        });

        dispatch_barrier_async(queue, ^{

            NSLog(@"dispatch_barrier_async");

            [NSThread sleepForTimeInterval:4];

        });

        dispatch_async(queue, ^{

            [NSThread sleepForTimeInterval:1];

            NSLog(@"dispatch_async3");

        });

    依次打印 dispatch_async1-dispatch_async2-dispatch_barrier_async

    4:dispatch_apply 

    执行某个代码片段N次。

    dispatch_apply(5, globalQ, ^(size_t index) {

        // 执行5次

    });

    相关文章

      网友评论

          本文标题:细说苹果的多线程处理-GCD

          本文链接:https://www.haomeiwen.com/subject/ixxjgxtx.html