`
啸笑天
  • 浏览: 3460994 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

dispatch_set_target_queue

 
阅读更多

 

dispatch_set_target_queue的两个作用:

 

酷用来给新建的queue设置优先级:

dispatch_queue_t serialQueue = dispatch_queue_create("com.oukavip.www",NULL);
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
 
dispatch_set_target_queue(serialQueue, globalQueue);
/* * 第一个参数为要设置优先级的queue,第二个参数是参照物,既将第一个queue的优先级和第二个queue的优先级设置一样。
     */

需要注意的是,第一个参数是自定义的queue(默认优先级就是global queue的default),而不是系统的queue(global/main)。因为你不能给系统的queue设置权限。通过上面设置,serialQueue 就有了与globalQueue一样的优先级。其实这个函数不仅可以设置queue的优先级,还可以设置queue之间的层级结构。

 

酷修改用户队列的目标队列,使多个serial queue在目标queue上一次只有一个执行:

它会把需要执行的任务对象指定到不同的队列中去处理,这个任务对象可以是dispatch队列,也可以是dispatch源。而且这个过程可以是动态的,可以实现队列的动态调度管理等等。比如说有两个队列dispatchA和dispatchB,这时把dispatchA指派到dispatchB:

dispatch_set_target_queue(dispatchA, dispatchB);

那么dispatchA上还未运行的block会在dispatchB上运行。这时如果暂停dispatchA运行:

dispatch_suspend(dispatchA);

则只会暂停dispatchA上原来的block的执行,dispatchB的block则不受影响。而如果暂停dispatchB的运行,则会暂停dispatchA的运行。

demo:

一般都是把一个任务放到一个串行的queue中,如果这个任务被拆分了,被放置到多个串行的queue中,但实际还是需要这个任务同步执行,那么就会有问题,因为多个串行queue之间是并行的。这时使用dispatch_set_target_queue将多个串行的queue指定到了同一目标,那么着多个串行queue在目标queue上就是同步执行的,不再是并行执行。

+(void)testTargetQueue {
    dispatch_queue_t targetQueue = dispatch_queue_create("test.target.queue", DISPATCH_QUEUE_SERIAL);
    
    
    
    dispatch_queue_t queue1 = dispatch_queue_create("test.1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue2 = dispatch_queue_create("test.2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue3 = dispatch_queue_create("test.3", DISPATCH_QUEUE_SERIAL);
    
    dispatch_set_target_queue(queue1, targetQueue);
    dispatch_set_target_queue(queue2, targetQueue);
    dispatch_set_target_queue(queue3, targetQueue);
    
    
    dispatch_async(queue1, ^{
        NSLog(@"1 in");
        [NSThread sleepForTimeInterval:3.f];
        NSLog(@"1 out");
    });

    dispatch_async(queue2, ^{
        NSLog(@"2 in");
        [NSThread sleepForTimeInterval:2.f];
        NSLog(@"2 out");
    });
    dispatch_async(queue3, ^{
        NSLog(@"3 in");
        [NSThread sleepForTimeInterval:1.f];
        NSLog(@"3 out");
    });
    
    
    
}

输出
 1 in
 1 out
 2 in
 2 out
 3 in
 3 out

 

 

 

 

 

分享到:
评论

相关推荐

    iOS GCD 多线程

    dispatch_set_target_queue(serialQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)); ``` 这样,`serialQueue` 将被作为低优先级全局队列的一个子队列,从而继承了该队列的优先级。 #### 三、...

    GCD常用和不常用API说明GCD-Demo-master.zip

    4. **dispatch_set_target_queue**:可以改变一个任务将来执行的队列,这对于调整任务优先级很有用。 5. **dispatch_apply**:在并行队列上重复执行一个任务,适用于循环操作,可以自动并行化。 四、GCD_Demo-...

    iOS控制多线程任务数量

    dispatch_set_target_queue(customQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)); // 设置队列的优先级 ``` 然后,我们可以在这个队列上提交任务,GCD会自动根据设定的并发数来调度任务...

    关于block的循环引用

    - 使用`dispatch_set_target_queue`或`dispatch_async`来改变Block的执行上下文,避免隐式持有`self`。 7. Swift中的闭包与循环引用: Swift中的闭包同样存在类似问题,但可以通过`captureList`来声明弱引用或无...

    ios 实现倒计时的两种方式

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); dispatch_source_set_...

    循环定时器功能

    dispatch_source_t timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); dispatch_source_set_timer(timerSource, dispatch_time(DISPATCH_TIME_NOW, 1.0 * ...

    iOS定时器Demo

    通过`dispatch_source_set_timer`设置定时器的间隔、初始延迟、精度和重复性。 - 使用`dispatch_get_main_queue()`确保在主线程上执行任务,保持UI更新同步。 - 与`NSTimer`不同,GCD定时器需要在不再使用时明确...

    IOS开发中延迟执行和取消

    dispatch_source_set_timer(timer, startTime, DISPATCH_TIME_FOREVER, 0); // ... dispatch_source_cancel(timer); ``` 总的来说,iOS开发中延迟执行和取消任务有多种实现方式,开发者可以根据实际需求和项目特点...

    iOS面试题-iOS部分

    - 在主线程执行代码,可以使用`[NSOperationQueue mainQueue]`或`dispatch_get_main_queue()`。 - 延时执行代码,可以使用`performSelector:withObject:afterDelay:`,或者GCD的`dispatch_after`。 这些都是iOS...

    按钮的拖动

    - 多线程处理:如果在主线程之外进行视图更新,确保在合适的地方调用`DispatchQueue.main.async`以保持界面流畅。 - 事件冲突:确保拖动操作不会与按钮的点击事件或其他手势冲突。 通过以上步骤,你可以在Android或...

    OC-NSInvocationOperation

    3. 设置目标和选择器:使用`-[NSInvocation setTarget:]`和`-[NSInvocation setSelector:]`,指定方法的执行目标和要调用的方法。 4. 创建`NSInvocationOperation`:使用`-initWithInvocation:`初始化`...

    python3.6.5参考手册 chm

    Removal of make touch build target Notable changes in Python 3.6.5 What’s New In Python 3.5 Summary – Release highlights New Features PEP 492 - Coroutines with async and await syntax PEP 465 - A...

Global site tag (gtag.js) - Google Analytics