在iOS中调用多种服务的更好方法是什么?

时间:2019-01-30 16:43:28

标签: ios swift request alamofire

我有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重复五次,这是另一种实现方法。

1 个答案:

答案 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