2017-09-15 135 views
-2

我有一个问题,其中一张表显示了一个很长的钻取列表,当用户导航离开并返回时,我想保留其当前滚动位置。避免重新加载UITableView数据

在我的视图控制器,我有代码,通过调用getDrillList(optimize: true)存储数据在一个名为drillListArray的属性中,每当视图出现时加载UITableView的数据。

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    getDrillList(optimize: true) 
} 

下面是加载数据

private func getDrillList(optimize: Bool = false) 
{ 
    // MAKE API CALL, THE ARRAY IS POPULATED IN THE COMPLETE HANDLER 

    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    SharedNetworkConnection.apiGetDrillList(apiToken: appDelegate.apiToken, limit: (optimize ? 13 : 0), completionHandler: { data, response, error in 
     guard let data = data, error == nil else {             // check for fundamental networking error 
      print("error=\(error)") 
      return 
     } 

     if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors 
      // 403 on no token 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 

      SharedNetworkConnection.apiLoginWithStoredCredentials(completionHandler: { data, response, error in 
       let appDelegate = UIApplication.shared.delegate as! AppDelegate 
       let json = try? JSONSerialization.jsonObject(with: data!, options: []) 
       if let dictionary = json as? [String: Any] { 
        if let apiToken = dictionary["token"] as? (String) { 
         appDelegate.apiToken = apiToken 
         self.getDrillList() 
        } 
       } 
      }) 
      return 
     } 

     self.drillListParser = DrillListParser(jsonString: String(data: data, encoding: .utf8)!) 
     self.drillListArray = (self.drillListParser?.getDrillListArray())! 

     DispatchQueue.main.async { 
      self.drillTableView.reloadData() 
     } 

     if optimize { 
      self.getDrillList() 
     } 
    }) 
} 

两个问题

代码

首先,如果用户示出了SEGUE到另一个视图控制器,并且然后经由Back返回,如何可以检查如果数据已经加载以避免再次加载它?检查数组是否为空是否安全?

其次,有没有什么影响我应该注意这种方法?

+0

为什么立即downvote?请帮我修改我的问题。 – paul

+0

我没有投票,但最有可能是由于你的问题缺乏信息。你展示了一段代码,它本身并不意味着什么,并希望人们能够在不知道你在做什么的情况下提供帮助。请提供[最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。 –

+1

把getDrillList放在ViewWillAppear中。将解决问题。 –

回答

2

viewDidLoad()中添加getDrillList(optimize: true),它将在生命周期中调用一次,或者您可以通过布尔标志检查是否已经加载数据。

+0

谢谢,我会试试这个。 – paul