设置 dispatch_group 的等待时间

setting wait time on dispatch_group

我正在尝试设置调度组的等待时间,但除非我设置 'DISPATCH_TIME_FOREVER',否则等待时间将被忽略。

如果我想将等待时间设置为 5 秒,我该如何实现?或者我是否需要更改为信号量并在该对象上设置超时?

示例代码:

dispatch_group_enter(group)

async(handler: handler)

dispatch_group_wait(group, DISPATCH_TIME_FOREVER)

我所要做的就是用数字(例如 5 秒)替换 DISPATCH_TIME_FOREVER。

就是这样。等待将忽略任何数字(例如 5、5 * NSEC_PER_SEC、Int64(number)、UInt64(number))或其他排列。

我希望,这个例子是'self explanatory'。看,超时是怎么定义的!

import Foundation

let group = dispatch_group_create()
let queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL)
dispatch_async(queue) { () -> Void in
    dispatch_group_enter(group)
    var i = 0
    while i < 15 {
        print(i)
        i++
        usleep(500000)
    }
    dispatch_group_leave(group)
}
//dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
let t = dispatch_time( DISPATCH_TIME_NOW, 5000000000)
dispatch_group_wait(group, t)
print("stop")

/* prints
0
1
2
3
4
5
6
7
8
9
stop
*/

Declaration dispatch_time_t dispatch_time( dispatch_time_t when, int64_t delta); Parameters when The dispatch_time_t value to use as the basis for a new value. Pass DISPATCH_TIME_NOW to create a new time value relative to now. delta The number of nanoseconds to add to the time in the when parameter. Return Value A new dispatch_time_t.

Discussion The default clock is based on mach_absolute_time.

您可以使用具有相同功能的简化版本

import Foundation

let group = dispatch_group_create()
let queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL)
dispatch_group_async(group, queue) { () -> Void in
    var i = 0
    while i < 15 {
        print(i)
        i++
        usleep(500000) // 0.5 sec delay
    }
}
// wait time a little bit more than 1 second
let t = dispatch_time( DISPATCH_TIME_NOW, 1100000000)
dispatch_group_wait(group, t)
print("stop")

/* prints
0
1
2
stop
*/

dispatch_group_wait(group, DISPATCH_TIME_FOREVER)

相同的代码打印所有 15 个数字 (0...14)