调度组多个加入 Swift

Dispatch Group Multiple Joined Swift

大家好,我有一个关于我想在 swift 中解决的问题的问题,并希望找到最好的解决方法。我目前有一种我不喜欢的方法,如果我能得到一些关于它的想法会很好。

问题出在这里:

LocationManager 示例:

示例代码:

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)
    }
}