iOS中GCD

作者: Jessica124 | 来源:发表于2016-11-14 14:40 被阅读9次

    常用的方法dispatch_async

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

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 耗时的操作

    dispatch_async(dispatch_get_main_queue(), ^{

    // 更新界面

    }); });

    多用GCD,少用performSelector

    dispatch_queue_t queue= dispatch_get_main_queue();

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), queue, ^{

    NSLog(@"主队列--延迟执行------%@",[NSThread currentThread]);

      });

    dispatch_once来执行只需要运行一次的线程安全代码

    + (instantClass *)sharedClient {

    static instantClass *_sharedClient = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

    _sharedClient = [[instantClass alloc] init];

    });

    return _sharedClient;

    }

    dispatch_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);

    dispatch_group_async是异步的方法,运行后可以看到打印结果:

    2012-09-25 16:04:16.737 gcdTest[43328:11303] group1

    2012-09-25 16:04:17.738 gcdTest[43328:12a1b] group2

    2012-09-25 16:04:18.738 gcdTest[43328:13003] group3

    2012-09-25 16:04:18.739 gcdTest[43328:f803] updateUi

    每个一秒打印一个,当第三个任务执行后,upadteUi被打印

    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");

    });

    打印结果:

    2012-09-25 16:20:33.967 gcdTest[45547:11203] dispatch_async1

    2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_async2

    2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_barrier_async

    2012-09-25 16:20:40.970 gcdTest[45547:11303] dispatch_async3

    请注意执行的时间,可以看到执行的顺序如上所述。

    不要使用dispatch_get_current_queue

    相关文章

      网友评论

          本文标题:iOS中GCD

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