调度组多个加入 Swift
Dispatch Group Multiple Joined Swift
大家好,我有一个关于我想在 swift 中解决的问题的问题,并希望找到最好的解决方法。我目前有一种我不喜欢的方法,如果我能得到一些关于它的想法会很好。
问题出在这里:
- 启动的DispatchQ序列号
- 然后另一个线程启动并等待一个完成块,每个 returns 1 个元素 运行
- 该线程将 运行 多次,每次都会给出 1 个元素,直到它 returns 所有元素
- 代码不应继续执行,必须等待所有元素都收集到数组中
- 数组填满后,代码可以继续进行。
LocationManager 示例:
- 位置管理器开始获取位置
- 它在每次找到新位置时输出位置
- 最后我必须收集我在 10 秒内获得的所有位置,例如
- 然后继续当前线程的工作
示例代码:
var queue = DispatchQueue("q")
queue.async {
var locationCollected = Array<Location>()
// this will output multiple times
getLocation { location in
// add location to the collection
locationCollected.append(location)
}
// the current Q need to wait until all results are collected
return locationCollected
}
func getLocation() -> Location {
// this is the function that will return location
self.manager?.location(completion: { location in
// will provide location and update
completion(location)
}
}
非常感谢您的帮助
如果您想采用线性代码流方法,那么您可以采用新的 async/await
结构,但这会限制您的 iOS 版本。
通常最好避免阻塞线程,因为它会导致死锁。您应该使用完成处理程序来获取异步结果而不是阻塞。
为了这个答案的目的,我将坚持你问题中的方法。
根据您问题中的要求,我们创建一个函数:
- 获取指定持续时间的位置
- 一次只获取一个位置
- 在数组中提供获取的位置
- 本身就是一个异步函数
我们需要确保一次只有一个位置提取处于活动状态,我们可以使用 DispatchSemaphore
func getLocations(for duration: TimeInterval, completion: (([Location])->Void)) {
var queue = DispatchQueue("q")
queue.async {
let semaphore = DispatchSemaphore(0)
var locationCollected = [Location]()
let startTime = Date()
while (startTime.timeIntervalSinceNow > -duration) {
getLocation { location in
locationCollected.append(location)
semaphore.signal()
}
semaphore.wait()
}
completion(result)
}
}
大家好,我有一个关于我想在 swift 中解决的问题的问题,并希望找到最好的解决方法。我目前有一种我不喜欢的方法,如果我能得到一些关于它的想法会很好。
问题出在这里:
- 启动的DispatchQ序列号
- 然后另一个线程启动并等待一个完成块,每个 returns 1 个元素 运行
- 该线程将 运行 多次,每次都会给出 1 个元素,直到它 returns 所有元素
- 代码不应继续执行,必须等待所有元素都收集到数组中
- 数组填满后,代码可以继续进行。
LocationManager 示例:
- 位置管理器开始获取位置
- 它在每次找到新位置时输出位置
- 最后我必须收集我在 10 秒内获得的所有位置,例如
- 然后继续当前线程的工作
示例代码:
var queue = DispatchQueue("q")
queue.async {
var locationCollected = Array<Location>()
// this will output multiple times
getLocation { location in
// add location to the collection
locationCollected.append(location)
}
// the current Q need to wait until all results are collected
return locationCollected
}
func getLocation() -> Location {
// this is the function that will return location
self.manager?.location(completion: { location in
// will provide location and update
completion(location)
}
}
非常感谢您的帮助
如果您想采用线性代码流方法,那么您可以采用新的 async/await
结构,但这会限制您的 iOS 版本。
通常最好避免阻塞线程,因为它会导致死锁。您应该使用完成处理程序来获取异步结果而不是阻塞。
为了这个答案的目的,我将坚持你问题中的方法。
根据您问题中的要求,我们创建一个函数:
- 获取指定持续时间的位置
- 一次只获取一个位置
- 在数组中提供获取的位置
- 本身就是一个异步函数
我们需要确保一次只有一个位置提取处于活动状态,我们可以使用 DispatchSemaphore
func getLocations(for duration: TimeInterval, completion: (([Location])->Void)) {
var queue = DispatchQueue("q")
queue.async {
let semaphore = DispatchSemaphore(0)
var locationCollected = [Location]()
let startTime = Date()
while (startTime.timeIntervalSinceNow > -duration) {
getLocation { location in
locationCollected.append(location)
semaphore.signal()
}
semaphore.wait()
}
completion(result)
}
}