2016-03-03 43 views
0

我正在使用Alamofire进行网络请求。当我加载一个新的viewcontroller时,我在ViewDidAppear中创建了一个新的请求来获取图片等的示例url。当我在ViewDidAppear中提出请求时,在数据出现之前会有一段延迟,我也在ViewDidLoad中尝试了一下,请求速度稍微快了一点,但是您可以稍后看到数据出现。当用户首次访问视图控制器时,用户将看到数据正在加载,但是有没有办法保留这些数据,以便当用户离开控制器时,例如当用户从推回去时在导航控制器中,然后再次向前导航而不再请求重新获取数据?如何在Swift中更快地发出网络请求

这是我在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() 
     } 



    } 

回答

1

尝试使网络请求在更早的视图控制器 - 比如说加载屏幕,然后传递到这个响应视图控制器。

或者,您可以将响应存储在缓存服务中的排序 - 当用户导航回到此视图控制器时,您可以在缓存中检查它是否已加载到视图(如果未调用请求)。

也使在viewDidLoad中的网络请求会更快,因为它viewDidAppear之前称为 - 但要记住viewDidLoad中只对其中的viewDidAppear被称为每个再次显示实例一次的viewController的特定实例调用一次(例如,如果它作为导航堆栈的底部并且用户按下它)。

记住用户 - 你不想咀嚼他们的数据,所以如果你知道请求会有相同的响应,你只需要做一次http请求。