2014-11-22 73 views
2

我有一個簡單的iOS應用程序編寫的Swift,加載通過Internet下載的JSON數據並將其顯示到UITableView中。當我第一次啓動應用程序時,一切正常,表格顯示正確的信息。UITableView重新加載數據不起作用

在我的應用程序,我有一個按鈕,當我想重新加載數據時觸發刷新。所以我在刷新刷新按鈕時調用displayTable()方法,它再次下載數據,然後調用主線程上的tableView.reloadData()方法刷新數據,但重新加載似乎不起作用。我手動更改服務器上的數據並刷新,但我仍然有舊數據緩存在我的應用程序中。我可以退出/終止應用程序,並且舊數據會永久保留,除非我刪除應用程序並重新安裝。

我附上了我的ViewController下面的代碼。我花了太多時間看這個,我似乎無法找到爲什麼reloadData不起作用。任何想法,提示將不勝感激。

感謝

--Vinny

class ViewController: UITableViewController { 

    var tableData = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func viewWillAppear(animated: Bool) { 
     println("viewWillAppear was just called") 
     super.viewWillAppear(true) 

     self.displayTable() 
    } 

    func displayTable() { 
     getJSONData("http://www.example.com/data.json") { (results, resultError) in 

      if (resultError == nil) { 
       if var results = results { 
        dispatch_async(dispatch_get_main_queue(), { 
         self.tableData = [] //create out data on subsequent refreshes 
         self.tableData = results 
         self.tableView.reloadData() //This doesn't appear to be working! 
        }) 
       } else { 
        self.displayErrorPopup() 
       } 
      } else { 
       self.displayErrorPopup() 
      } 
     } 
    } 

    func displayErrorPopup() { 
     let alertViewController = UIAlertController(title: "Error", message: "Couldn't connect to API", preferredStyle: .Alert) 
     let okButton = UIAlertAction(title: "OK", style: .Default, handler: nil) 
     let cancelButton = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 
     alertViewController.addAction(okButton) 
     alertViewController.addAction(cancelButton) 
     self.presentViewController(alertViewController, animated: true, completion: nil) 
    } 

    //todo - extract this method into it's own class 
    func getJSONData(ttAPIURL : String, completion: (resultsArray: NSArray?, resultError: NSError?) ->()){ 
     let mySession = NSURLSession.sharedSession() 
     let url: NSURL = NSURL(string: ttAPIURL)! 

     let networkTask = mySession.dataTaskWithURL(url, completionHandler : {data, response, error -> Void in 
      var err: NSError? 
      if (error == nil) { 
       var theJSON = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSMutableDictionary 
       let results : NSArray = theJSON["list"]!["times"] as NSArray 
       completion(resultsArray: results, resultError: error) 
      } else { 
       completion(resultsArray: nil, resultError: error) 
      } 
     }) 
     networkTask.resume() 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return tableData.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("ttCell", forIndexPath: indexPath) as UITableViewCell 
     let timesEntry = self.tableData[indexPath.row] as NSMutableDictionary 
     cell.textLabel.text = (timesEntry["routeName"] as String) 
     return cell 
    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    @IBAction func refreshButtonTap(sender: AnyObject) { 
     self.displayTable() 
    }  
} 

回答

0

謝謝您的回答drewag和Jirom。偉大的評論,非常有幫助。我剛剛發現了我的問題,以及之前我應該​​考慮的事情。託管我的動態JSON數據的域受CloudFlare保護,看起來我的頁面規則禁用某個目錄的緩存不起作用。所以所有的JSON內容都被緩存了,這就是我的應用程序不會顯示新數據的原因。

再次感謝你們的回覆。

--Vinny

PS:每Drewag的建議下,我加入NSURLSessionConfiguration的一個實例,它定義的行爲和政策,在下載使用NSURLSession對象數據時使用,並設置Urlcache文件屬性設置爲無禁用緩存。

let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
config.URLCache = nil 
let mySession = NSURLSession(configuration: config) 
4

好了,你說reloadData沒有工作,但是這是幾乎可以肯定不是你的問題。爲了調試這個你應該:

  1. 確保reloadData實際上是被稱爲(斷點或println
  2. 檢查被稱爲UITableViewDataSource方法調用reloadData(斷點或的println)
  3. 檢查results後陣列,你從網絡請求回來(可能是println(results)

我的猜測是,它是在3號的失敗,這意味着它與reloadData無關。也許共享NSURLSession啓用了緩存?嘗試將mySession.URLCache設置爲nil

+0

嗨drewag和謝謝。我已經驗證reloadData是通過使用println以及調試器來調用的。我還打印出結果數組並確認正在返回正確的數據。 我需要驗證UITableViewDataSources方法被調用。將回報 – 2014-11-22 14:17:38

1

試圖取代它

override func viewWillAppear(animated: Bool) { 
    println("viewWillAppear was just called") 
    super.viewWillAppear(true) 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {() -> Void in 
     self.displayTable() 
    }) 
}