我有5个不同的服务请求,每个单元都加载到同一UItableView中。
执行此操作的最佳方法是什么。
https://example.com/?api/service1
https://example.com/?api/service2
https://example.com/?api/service3
https://example.com/?api/service4
https://example.com/?api/service5
let url = "https://example.com/?api/service1
Alamofire.request(url, method: .get, parameters:nil encoding: JSONEncoding.default, headers: nil)
.responseJSON { response in
print(response.result.value as Any) // result of response serialization
}
使用不同的服务名称将同一Alamofire重复五次,这是另一种实现方法。
答案 0 :(得分:1)
看看使用DispatchGroup来执行多个异步请求,然后等待它们全部完成。
对于每个任务,您调用group.enter()
,在其完成处理程序中,当您知道请求已完成时,请调用group.leave()
。然后是一个notify方法,它将等待所有请求调用leave
来告诉您它们已经全部完成。
我已经在Playground中创建了一个示例(由于使用了URL,该示例会因错误而失败)
import UIKit
import PlaygroundSupport
let serviceLinks = [
"https://example.com/?api/service1",
"https://example.com/?api/service2",
"https://example.com/?api/service3",
"https://example.com/?api/service4",
"https://example.com/?api/service5"
]
// utility as I've not got alamofire setup
func get(to urlString: String, completion: @escaping (Data?, URLResponse?, Error?) -> Void) {
let url = URL(string: urlString)!
let session = URLSession.shared
let task = session.dataTask(with: url) { data, response, error in
completion(data, response, error)
}
task.resume()
}
let group = DispatchGroup()
for link in serviceLinks {
group.enter() // add an item to the list
get(to: link) { data, response, error in
// handle the response, process data, assign to property
print(data, response, error)
group.leave() // tell the group your finished with this one
}
}
group.notify(queue: .main) {
//all requests are done, data should be set
print("all done")
}
PlaygroundPage.current.needsIndefiniteExecution = true
您可能无法像我一样仅遍历URL,因为每种服务的处理方式可能不同。您需要根据需要进行调整。
关于DispatchGroups
的在线信息有很多,例如this article