GCD简单使用一

线程问题可能是我们在开发中经常要遇到的问题,深入了解一下很有必要。

一、后台执行操作拿到数据回到主线程展示,经常要用到

1.1、第一种方法

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{//后台执行的操作
        //do something.
        dispatch_async(dispatch_get_main_queue(), ^{//回到主线程的操作
            //do something.
        });
    });

1.2、第二种方法

/**
 *  创建一个线程在子线程中执行
 *
 *  @param aSelector 方法名(新创建的线程)
 *  @param arg       方法的参数
 */
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
/**
 *  在主线程中,执行制定的方法
 *
 *  @param aSelector 方法名
 *  @param arg       方法参数
 *  @param wait      YES,指定当前线程是否要被阻塞,直到主线程将我们制定的代码块执行完
 */
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
/**
 *  自定义回到哪个线程执行的方法
 *
 *  @param aSelector 方法名
 *  @param thr       线程名
 *  @param arg       方法参数
 *  @param wait      YES(如果当前线程为主线程的时候,waitUntilDone:YES参数无用)
 */
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait;

二、代码只需要执行一次的操作,比如单例的创建

 static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //code
    });

三、延时操作

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //code
    });

四、分组操作

// 合并汇总结果
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
        // 并行执行的线程一
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
        // 并行执行的线程二
    });
    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
        // 上面并行线程结束后调用,汇总结果,
    });

你可能感兴趣的:(线程,gcd)