如何在 Swift 中加快网络请求速度

How to make network request faster in Swift

我正在使用 Alamofire 进行网络请求。当我加载一个新的 viewController 时,我在 ViewDidAppear 中发出一个新请求,以获取图像等的示例 url。当我在 ViewDidAppear 中发出请求时,在数据出现之前有一个延迟,我也尝试在 ViewDidLoad 中请求快一点,但你仍然可以看到数据在一个小的延迟后出现。没关系,当用户第一次访问 viewController 时,用户会看到数据正在加载,但是有没有办法保留数据,以便当用户离开控制器时,例如当用户离开时从 navigationController 中的推送返回,然后再次向前导航而不再次请求获取数据?

这是我在 ViewDidAppear 中的请求之一。

希望大家能帮忙 - 谢谢

override func viewDidAppear(animated: Bool) {

    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
    var parameters = [String: AnyObject]()

    if(self.MySelf) {
        parameters = ["userId": LoginViewController.CurrentUser.UserID as AnyObject]
    }
    else {
        parameters = ["userId": self.UserID as AnyObject]
    }


    //GET posts
    Alamofire.request(.POST, Config.ApiURL + "getUserPosts?token=" + LoginViewController.CurrentUser.Token, parameters: parameters as! [String : AnyObject]).responseJSON{ response in
        print(response)

        switch response.result {
        case .Success(let data):
            let json = JSON(data)
            if let posts = json["post"]["data"].array {
                self.postArray = posts
                self.postArray = self.postArray.reverse()

                self.navigationItem.title = json["user"]["firstname"].string! + " " + json["user"]["lastname"].string!

                self.User = json["user"]
                self.UserPic = self.User["photourl"].string!
            }
            else {
                print("Array is empty")
            }

        case .Failure(let error):
            print("Request failed with error: \(error)")
        }

        self.ProfilePostColView?.reloadData()
    }
}

尝试在较早的视图控制器中发出网络请求 - 比如加载屏幕,然后将响应传递给此视图控制器。

或者,您可以将响应存储在各种缓存服务中 - 当用户导航回此视图控制器时,您可以检查它是否已经在缓存中,如果不调用请求,则将其加载到视图中。

另外,在 viewDidLoad 中发出网络请求会更快,因为它在 viewDidAppear 之前调用 - 但请记住,viewDidLoad 仅针对 viewController 的特定实例调用一次,而每次调用该实例时都会调用 viewDidAppear再次显示(例如,如果它作为导航堆栈的底部并且用户按下回到它)。

牢记用户——你不想浪费他们的数据,所以如果你知道请求将有相同的响应,你只想发出一次 http 请求。