Alamofire 请求大约需要 10 秒

Posted

技术标签:

【中文标题】Alamofire 请求大约需要 10 秒【英文标题】:Alamofire requst taking around 10 seconds 【发布时间】: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,但所有内容仍在尝试同时更新。 【参考方案1】:

如果您的 API 链接的 Per_Page 超过 50,通常加载需要更多时间。在处理包含图像和视频的 API 和请求时,这可能会导致延迟。

【讨论】:

以上是关于Alamofire 请求大约需要 10 秒的主要内容,如果未能解决你的问题,请参考以下文章

Moya Requests 需要很长时间才能响应

这个块在 Swift - Alamofire 中是啥意思?

在 Symfony 1.4 中加载列表页面在新服务器上需要大约 10 秒

为啥没有网络连接时 Alamofire 需要这么长时间才能超时?

改进 postgresql 选择请求执行时间

Xcode:Alamofire 源代码中的 Swift Dropbox 错误