[iOS] GCD任务分发

来源:互联网 发布:双拼域名.com 编辑:程序博客网 时间:2024/06/06 07:43

[iOS]GCD任务分发

GCD 任务分发

    /**     前缀非常统一 dispatch_     dispatch_async_f(<#dispatch_queue_t queue#>, <#void *context#>, <#dispatch_function_t work#>)     用C++ 的方式 和C的方式     [串行]     GCD-NSThread+Block     dispatch_queue_t curQueue = dispatch_get_main_queue();     使用主队列(跟主线程相关联的队列)     主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行     使用dispatch_get_main_queue()获得主队列     dispatch_queue_t curQueue = dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>);     队列名称, 队列属性,一般用NULL     非ARC需释放    dispatch_release(curQueue);     [并发]     dispatch_queue_t curQueue = dispatch_get_global_queue(<#dispatch_queue_priority_t priority#>, <#unsigned long flags#>)     GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建     使用dispatch_get_global_queue函数获得全局的并发队列     这里flags是保留字,现在没用,以后可能有用,传0     */    // 创建队列    dispatch_queue_t curQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);     // 优先级高    dispatch_queue_t curQueue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);// 优先级中    dispatch_queue_t curQueue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW , 0);    // 优先级低        // 用异步的方式 分发任务    // 任务1    // 不同队列之间“并发”执行,每个队列里的任务“串行”执行,并且先加进队列的任务先执行    dispatch_async(curQueue, ^{        NSLog(@"当前线程:%@",[NSThread currentThread]);        //[self fristWork];    });    // 任务2    dispatch_async(curQueue2, ^{        NSLog(@"当前线程:%@",[NSThread currentThread]);        //[self secondWork];    });    // 任务3    dispatch_async(curQueue3, ^{        NSLog(@"当前线程:%@",[NSThread currentThread]);        //[self thirdWork];    });        /**     只执行一次操作     */    // 创建队列    dispatch_queue_t mainQueue = dispatch_get_main_queue();    // 创建静态全局变量onceToken    static dispatch_once_t onceToken;    void(^executedOnlyOnce)(void) = ^{        NSLog(@"执行一次!");    };    // 只执行一次操作 dispatch_once的使用    dispatch_once(&onceToken, ^{        dispatch_async(mainQueue, executedOnlyOnce);        NSLog(@"once");    });        // 后面程序检测到与地址&onceToken相同,就不会执行    dispatch_once(&onceToken, ^{        dispatch_async(mainQueue, executedOnlyOnce);        NSLog(@"once");    }); 

子线程中执行操作后,若要更新UI,则需要通知主线程刷新;

    // 在子线程中执行操作    dispatch_async(dispatch_get_global_queue(0, 0), ^{        // 处理耗时操作        dispatch_async(dispatch_get_main_queue(), ^{            // 通知主线程刷新        });    });


0 0
原创粉丝点击