【发布时间】:2016-09-28 19:00:31
【问题描述】:
我已经在我的带有良好 wifi 的 Mac 和我的手机上使用 wifi/data 运行了这段代码,但我在下面的代码上加载时间非常慢。我的 UI 大约需要 7 到 10 秒才能更新,这是我在视图控制器中的第二个代码块中 ... 所在的位置。
这不是我第一次处理网络请求,而且我从来没有遇到过这种缓慢的行为。这是我第一次使用 Alamofire 和我在 downloadProfileInformation 中使用的这种完成处理程序,其中 DownloadComplete 是 () -> () 的类型。
我想问题可能出在那儿。我猜在完全下载所有内容之前它不会更新 UI,但是下载图片应该需要 10 秒吗?
https://blzgdapipro-a.akamaihd.net/game/unlocks/0x0250000000000BB0.png
这是一个可以从 API 中获取的链接示例。
我也不知道问题出在 API 上吗?我从来没有听说过这样的事情,但我不知道有什么可能。
https://api.lootbox.eu/documentation
编辑:
//Called with IBAction
PROFILE_URL = "\(URL_BASE)\(Info.sharedInstance.platform)/\(Info.sharedInstance.region)/\(Info.sharedInstance.battletag)/profile"
Alamofire.request(PROFILE_URL).responseJSON { response in
let result = response.result
if let dict = result.value as? Dictionary<String,Any> {
if let error = dict["error"] as? String {
print(error)
} else {
if let data = dict["data"] as? Dictionary<String,Any> {
//Assigning variables to that value
if let username = data["username"] as? String {
DispatchQueue.main.async {
self.battletagNameOutlet.text = username
print("battletag update happening")
}
}
if let level = data["level"] as? Int{
...
}
if let avatarURL = data["avatar"] as? String {
...
}
if let competitive = data["competitive"] as? Dictionary<String,Any> {
....
}
}
}
}
}
}
}
【问题讨论】:
-
您正在从 backgtound 线程更新 UI。您的请求很好,但您的完成处理程序不是。这里有多个类似的问题。
-
@Sulthan - Alamofire 在主线程上为您运行其完成处理程序,除非您手动指定一些其他队列来运行完成块。使用
NSURLSession,您的观点会得到很好的理解,但 Alamofire 通常不会担心。 -
Hibernia,唯一让我惊讶的是您正在运行连续的请求,因此任何网络延迟都会成倍增加。如果您可以将其设计为处理单个请求或并发请求,您将获得性能改进。我建议您改进调试以确定延迟的哪一部分发生在哪里,然后您就可以从那里解决重新设计的问题。但是您希望在收到响应时更新 UI,而不是等待所有内容。顺便说一句,您在任何地方都没有执行任何同步请求(例如
NSData(contentsOfURL:))? -
@Rob 我没有在任何地方做任何同步请求。这可能是非常不必要的,但我只是将所有内容移出类并在主视图控制器中弹出它并划掉“完成”位。当我从字典中获取诸如级别之类的值时,我正在更新 UI 并将其包装为 DispatchQueue.main.async,但所有内容仍在尝试同时更新。