gpt4 book ai didi

ios - 嵌套调度组

转载 作者:行者123 更新时间:2023-11-28 07:46:21 25 4
gpt4 key购买 nike

我尝试使用嵌套的 DispatchGroup,这是我的代码:

 class TranslateService {
private let myGroup = DispatchGroup()
func translateText(text:[String],closure:@escaping ((_ success:String?,_ error:Error?) -> Void)) {

var translateString: String = ""
var responseError: Error?

for index in 0...text.count - 1 {

let urlString = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20171105T134956Z.795c7a0141d3061b.dc25bae76fa5740b2cdecb02396644dea58edd24&text=\(text[index])&lang=fa&format=plain&options=1"
if let allowString = Utilities.shareInstance.getQueryAllowedString(url: urlString) {
if let url = URL(string:allowString){
myGroup.enter()
Alamofire.request(url).responseJSON { response in
guard let responseData = response.data else {
self.myGroup.leave()
return
}
do {
let json = try JSONSerialization.jsonObject(with: responseData, options: [])
if let res = json as? [String:Any] {
if let code = res["code"] as? Int {
if code == 200 {
if let textArr = res["text"] as? [AnyObject] {
let flattArr = Utilities.shareInstance.flatStringMapArray(textArr)
if flattArr.count > 0 {
translateString += "،" + flattArr[0]
}
}
}
}
self.myGroup.leave()
}
}catch {
responseError = error
self.myGroup.leave()
}
}
self.myGroup.notify(queue: .main) {
print("Finished all requests.")
print(translateString)
closure(translateString, responseError)
}
}
}
}
}
}

class AddressService {
private let translateService: TranslateService = TranslateService()
private let myGroup = DispatchGroup()
func fetchAddressFromGeographicalLocation(latitude: Double, longitude: Double,closure:@escaping ((_ success:String,_ name:String,_ error:Error?) -> Void)) {

var address: String = ""
let name: String = ""
var responseError: Error?
if let url = URL(string:"https://maps.googleapis.com/maps/api/geocode/json?latlng=\(latitude),\(longitude)&key=AIzaSyAdEzHZfZWyjLMuuW92w5fkR86S3-opIF0&language=fa&region=IR&locale=fa"){
self.myGroup.enter()
Alamofire.request(url).responseJSON { response in

guard let responseData = response.data else {
self.myGroup.leave()
return
}
do {
let json = try JSONSerialization.jsonObject(with: responseData, options: [])
if let addressDic = json as? [String:Any] {
if let result = addressDic["results"] as? [AnyObject] {
if result.count > 0 {
let flattRes = Utilities.shareInstance.flatMapArray(result)
let item = flattRes[0]
address = item["formatted_address"] as? String ?? ""
var res = address
if res.isContainEnglishCharachter {
self.myGroup.enter()
let resArr = res.components(separatedBy: ",")
var all : [String] = []
for item in resArr {
if item != " " {
all.append(item)
}}
self.translateService.translateText(text: all, closure: {stringAdd,error in
self.myGroup.enter()
if error != nil {
self.myGroup.leave()
}else {
address = stringAdd ?? ""
self.myGroup.leave()
} })
}else {
self.myGroup.leave()
}
}
}
}
}catch {
responseError = error
self.myGroup.leave()
}
self.myGroup.notify(queue: .main) {
// print("Finished all requests.")
closure(address, name, responseError)
}
}
}
}
}

我想要的只是我放在 AddressService 类中的 myGroup 等待我放在 TranslateService 类中的 myGroup。但是现在 self.myGroup.notify 没有在 AddressService 类中调用,所以关闭不起作用。怎么解决这个问题,谢谢大家的解答。

最佳答案

我认为你把它复杂化了。

如果我理解了一点,你想要做的是:

  • 从地址服务获取地址。
  • 使用翻译服务逐一翻译该地址的一些词。

当使用 Address 服务时,只会进行一次调用,因此此时无需使用 Dispatch Groups。调度组用于同步多个异步调用。

对于您的翻译服务,您可以充分利用 Dispatch 组,因为您是在 for 循环内调用该服务。这里的问题是,实现有点错误。您正在 for 循环内设置通知 block ,它应该在外部,以便在循环内的所有调用完成时只触发一次。

因此将此 block 移到翻译服务中的 for 循环之外:

self.myGroup.notify(queue: .main) {
print("Finished all requests.")
print(translateString)
closure(translateString, responseError)
}

现在“完成所有请求”。当所有请求都完成后,只会打印一次。

在地址服务中你根本不需要调度组。只需等待完成 block 被调用即可。

self.translateService.translateText(text: all, closure: {stringAdd,error in
Everything is done here already.
}

关于ios - 嵌套调度组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50910711/

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