gpt4 book ai didi

swift 3 DispatchGroup leave 在 helper 类函数中调用时导致崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 22:56:35 26 4
gpt4 key购买 nike

我正在使用 DispatchGroup.enter() 和 leave() 来处理辅助类的 reverseG 异步函数。问题很明显,我正在使用 mainViewController 的对象在辅助类中调用 mainViewController 的 dispatchGroup.leave() !有办法吗?

当在主视图 Controller 中声明 reverseG 时,相同的代码会起作用。

class Geo {
var obj = ViewController()

static func reverseG(_ coordinates: CLLocation, _ completion: @escaping (CLPlacemark) -> ()) {
let geoCoder = CLGeocoder()
geoCoder.reverseGeocodeLocation(coordinates) { (placemarks, error) in
if let error = error {
print("error: \(error.localizedDescription)")
}
if let placemarks = placemarks, placemarks.count > 0 {
let placemark = placemarks.first!
completion(placemark) // set ViewController's properties
} else {
print("no data")
}
obj.dispatchGroup.leave() // ** ERROR **
}
}


}

从主视图 Controller 调用函数

dispatchGroup.enter()
Geo.reverseG(coordinates, setValues) // completionHandler: setValues

dispatchGroup.notify(queue: DispatchQueue.main) {

// call another function on completion

}

最佳答案

每个 leave 调用都必须有一个关联的 enter 调用。如果您在没有先调用 enter 的情况下调用 leave,它将崩溃。这里的问题是您在某个组上调用 enter,但是 reverseGViewController< 的其他一些实例上调用 leave/。我建议将 DispatchGroup 作为参数传递给您的 reverseG 方法。或者,更好的是,reverseG 不应该离开组,而是将 leave 调用放在 reserveG 调用的完成处理程序中。

dispatchGroup.enter()
Geo.reverseG(coordinates) { placemark in
defer { dispatchGroup.leave() }

guard let placemark = placemark else { return }

// use placemark here, e.g. call `setValues` or whatever
}

dispatchGroup.notify(queue: DispatchQueue.main) {
// call another function on completion
}

class Geo {
// var obj = ViewController()

static func reverseG(_ coordinates: CLLocation, completion: @escaping (CLPlacemark?) -> Void) {
let geoCoder = CLGeocoder()
geoCoder.reverseGeocodeLocation(coordinates) { placemarks, error in
if let error = error {
print("error: \(error.localizedDescription)")
}
completion(placemarks?.first)

// obj.dispatchGroup.leave() // ** ERROR **
}
}

}

这将 DispatchGroup 逻辑保持在应用程序的一个级别,使您的类不那么紧密耦合(例如,地理编码器不需要知道 View Controller 是否使用调度组)。

坦率地说,如果只有一个电话,我不清楚您为什么要使用调度组。通常你会把你调用的任何东西放在完成处理程序中,进一步简化代码。通常只有在进行一系列调用时才使用组。 (也许你只是简化了你的代码片段,而你实际上是在进行多次调用。在这种情况下,一个调度组可能是有意义的。但是话又说回来,你不应该进行并发地理编码请求,建议一个完全不同的模式,完全。

关于swift 3 DispatchGroup leave 在 helper 类函数中调用时导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45534801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com