gpt4 book ai didi

ios - 使用 DispatchGroup 同步 Alamofire 请求

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

我需要等到 Alamofire 请求完成获取数据。 (错误或值)。我在另一个函数的 for 循环内调用 Alamofire 函数,以便 Alamofire 请求应该在调用第二个 for 循环之前完成。例如;第一个循环 -> 第一个请求 -> 第二个循环 -> 第二个请求...依此类推。现在它进入第一个循环 -> 第二个循环 -> 在所有循环完成后请求响应开始。

请求函数:

 func like(sender_id: String, completion: @escaping (String?) -> ()){
let group = DispatchGroup()
if let key = api_key{
let headers: HTTPHeaders = [
"X-Auth-Token": key,
"Accept": "application/json"
]
group.enter()
Alamofire.request(baseUrl + likeURL + sender_id, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).validate()
.responseJSON { (response) -> Void in
guard response.result.isSuccess else {
print("Error while doing : \(response.result.error)")
completion(nil)
group.leave()
return
}
if let error = response.error{
completion(nil)
group.leave()
print("Error Occured with Request: \(error)")
}
if let jsonData = response.data{
let json = JSON(data: jsonData)
print(json)
group.leave()
if let matched = json["match"].bool{
completion(matched.description)
print("Liked!: \(matched)")
if(matched){
}
}else{
group.leave()
"There is an error with JSON"
}
}}
}
}

我打电话的地方:

 func like_all(completion: @escaping() -> ()){
for user in SharedUsers.sharedUser.users{
if let id = user.id{
Network.sharedInstance.like(sender_id: id) { result in
print(result)
}
}
else{
continue
}
}
completion()
}

最佳答案

您正在使用调度组,显然是为了在函数末尾等待组。但是您没有等待它,所以您没有得到您正在寻找的同步行为。

但这很好,因为如果您在主线程上等待该组(或信号量,实现此行为的其他模式),您不仅会阻塞主线程(这会导致在糟糕的用户体验中,并且有可能让你的应用程序被看门狗进程杀死),你将陷入僵局,因为 responseJSON 使用主队列作为它的完成处理程序。因此,在对调度组/信号量添加 wait() 调用之前,请确保将整个 for 循环异步调度到某个后台线程。这避免了阻塞主线程并消除了死锁风险。

但是整个模式存在根本性缺陷,因为您根本不应该使用分派(dispatch)组或信号量来使其同步。这就提出了几个问题:

第一个问题是为什么要同步。网络请求具有固有的延迟,因此您执行一系列请求会非常慢。仅在绝对必要时才执行此请求序列(例如,无法形成每个请求,因为它需要先前请求的响应中的某些内容)。但这里似乎并非如此。那么为什么要让这个过程变得不必要呢。

但让我们暂时假设您绝对必须按顺序执行这些操作(据我所知,这里不正确,但让我们梳理一下)。那么有两种连续而不是同时执行一系列请求的模式:

  • 您可以完全放弃此 for 循环,而只使用一个例程发送第 n 个请求并在其完成处理程序中发送请求 n+1。这完全消除了调度组/信号量阻塞线程的需要。

  • 或者您可以将其包装在操作中(例如 https://stackoverflow.com/a/27022598/1271826 )并使用操作队列。

关于ios - 使用 DispatchGroup 同步 Alamofire 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47718265/

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