【发布时间】:2017-03-02 23:19:00
【问题描述】:
这是场景,一切正常,但我在主队列上挂断了。我有:
- 管理 API 连接的单例类。一切正常(除了执行时间......)
- 多个视图控制器通过上述单例类调用 GET API 来获取数据
- 我通常从 viewDidLoad 或 viewWillAppear 调用上述方法
- 它们都可以工作,但是 ....
- 如果我用闭包调用几个用 Alamofire.request() 实现的 API 方法(嗯,我需要知道它是什么时候 是时候重新加载了!),两者之一挂起等待默认 (main) queue 给它一个线程,它可能需要长达 20 秒
- 如果我只调用一个,做我的事,然后调用一个 POST API,这个 后一种情况与(5)相同,需要很长时间 是时候在默认队列中抢占一个位置了。
我没有在 Alamofiore.request() 中指定队列,我觉得我应该这样做,所以我试了一下。我在我的单例 API 类中添加了一个自定义并发队列,并尝试将它添加到我的 Alamofiore.request() .....但这完全没有做任何事情。请帮忙,我一定遗漏了一些明显的东西?!
这是我的单例 API 管理器(摘录)类:
class APIManager {
// bunch of stuff here
static let sharedInstance = APIController()
// more stuff here
let queue = DispatchQueue(label: "com.teammate.response-queue", qos: .utility, attributes: [.concurrent])
// more stuff
func loadSports(completion: @escaping (Error?) -> Void) {
let parameters: [String: Any?] = [:]
let headers = getAuthenticationHeaders()
let url = api_server+api_sport_list
Alamofire.request(url, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseString (queue: queue) { response in
if let json = response.result.value {
if let r = JSONDeserializer<Response<[Sport]>>.deserializeFrom(json: json) {
if r.status == 200 {
switch r.content{
case let content as [Sport]:
self.sports = content
NSLog("sports loaded")
completion(nil)
default:
NSLog("could not read the sport list payload!")
completion(GenericError.reportError("could not read sports payload"))
}
}
else {
NSLog("sports not obtained, error %d %@",r.status, r.error)
completion(GenericError.reportError(r.error))
}
}
}
}
}
// more stuff
}
这就是我在获得 sigleton 后从 APIManager 调用方法的方式:
api.loadSports(){ error in
if error != nil {
// something bad happened, more code here to handle the error
}
else {
self.someViewThingy.reloadData()
}
}
再一次,这一切都有效,只是如果我从同一个 UIViewController 进行多个 Alamofire 调用,第一个很快,其他所有调用都会永远等待队列中的一个位置运行。
【问题讨论】:
标签: swift alamofire grand-central-dispatch