tableView不更新,直到我点击另一个选项卡,并迅速返回

我是新来的iOS,我通过parsingJSON数据dynamic地从Web源填充tableView数据。 但问题是,当我第一次访问该选项卡时什么也没有显示。 在我访问另一个选项卡并返回后,它在tableView上正确显示数据。

这是我的代码

import UIKit class BranchViewController: UITableViewController , UISearchBarDelegate, UISearchDisplayDelegate { var branches = [Branch]() var filteredBranch = [Branch]() var BranchArray = [BranchTable]() var BranchLocationArray = [BranchLocation]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.tableView!.delegate = self self.tableView!.dataSource = self let url = NSURL(string: "http://rana.ninja/branches.php") let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in println(NSString(data: data, encoding: NSUTF8StringEncoding)) var error: NSError? let jsonData: NSData = data /* get your json data */ let json = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary if let name: AnyObject = json["name"] { for var index = 0; index < name.count; ++index { var Name : String = name[index] as NSString self.branches.append(Branch(name: Name)) println(Name) } } } task.resume() BranchArray = [BranchTable(BranchTitle: ["FirstFirst","SecondFirst","ThirdFirst"]), BranchTable(BranchTitle: ["FirstSecond","SecondSecond","ThirdSecond"]), BranchTable(BranchTitle: ["FirstThird","SecondThird","ThirdThird"]), BranchTable(BranchTitle: ["FirstFourth"])] BranchLocationArray = [BranchLocation(BranchLocationValues: ["asdfasd","asdfasd","asdfas"]), BranchLocation(BranchLocationValues: ["asdkljf","asdfasd","asdfas"]), BranchLocation(BranchLocationValues: ["asdkljf","asdfasd","asdfas"]), BranchLocation(BranchLocationValues: ["asdkljf","asdfasd","asdfas"])] // Reload the table self.tableView.reloadData() } 

在更新数据结构之后,您需要调用tableView.reloadData 。 这必须在主线程中完成,因此:

  let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in println(NSString(data: data, encoding: NSUTF8StringEncoding)) var error: NSError? let jsonData: NSData = data /* get your json data */ let json = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary if let name: AnyObject = json["name"] { for var index = 0; index < name.count; ++index { var Name : String = name[index] as NSString self.branches.append(Branch(name: Name)) println(Name) } } // NOTE: Calling reloadData in the main thread dispatch_async(dispatch_get_main_queue()) { self.tableView.reloadData() } } 

看起来,你的数据加载是asynchronous完成的,但是你正在重新加载闭包之外的表,所以它可能会在加载完成之前被执行。 所以,你可以把表重新加载closures。

而且,build议的排队方式也不错,你可以在苹果的文档里读一下GCD:

dispatch_async(dispatch_get_main_queue()) { // Assign Job To The Main Queue }

dispatch_async在派发队列中提交asynchronous执行块并立即返回。 它有两个参数 – queue ; 要提交块和block的队列要提交的作业。