UITableView 在使用 SwiftyJSON 和 Alamofire 从 API 返回数据之前渲染

UITableView got rendered before data from API returned using SwiftyJSON and Alamofire

当我在 viewDidLoad() 中调用 callapi() 函数时,callapi 中的 println() 会打印其中包含 Post 对象的 posts 数组,但是 viewDidLoad() 函数中的 println() 会打印一个空数组。此外,当我构建项目时,我收到此错误 "fatal error: Array index out of range"。 tableView 函数中的 println() 语句也打印一个空数组。 table 似乎在 API 的数据到达之前就已呈现 我该如何解决这个问题?

var posts = [Post]()

override func viewDidLoad() {
    super.viewDidLoad()
    callapi()
    println(self.posts)
}

func callapi(){
    request(.GET, "url")
    .responseJSON { (request, response, data, error) in
        let json = JSON(data!)
        if let jsonArray = json.array {
            for post in jsonArray {
                var onepost = Post(id:post["id"].stringValue,                    

              title:post["title"].stringValue, 
              author:post["author"].stringValue, 
              post:post["post"].stringValue,   
              created_on:post["created_on"].stringValue, 
              updated_on:post["updated_on"].stringValue)
                self.posts.append(onepost)
                println(self.posts)
                self.tableView.reloadData()
            }
        }
    }
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath
 indexPath: NSIndexPath) -> UITableViewCell {
    let cellIdentifier = "Cell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier,
    forIndexPath: indexPath) as! CustomTableViewCell

    println(self.posts)
    let post = self.posts[indexPath.row]
    // Configure the cell...
    cell.titleLabel!.text = self.posts[indexPath.row].title
    cell.postLabel.text = post.post
    println(self.posts)
    return cell
}

确保将 tableView:numberOfRowsInSection: 设置为 return self.posts.count

viewDidLoad 被调用时,它启动了异步 callapi,但是当 viewDidLoad 完成时,posts 仍然是空的。但是 table 视图仍将继续其初始加载过程,即使 posts 尚未填充,因此您必须确保 tableView:numberOfRowsInSection: return 为零这点。

稍后,callapi 完成 Alamofire GET 请求并调用 reloadData。只有在这一点上应该 tableView:numberOfRowsInSection: return 非零值。

最重要的是,确保 tableView:numberOfRowsInSection: return 是 posts 中的实际条目数,问题应该得到解决。

只需在 viewDidAppear 中插入重新加载即可:

override func viewDidAppear(animated: Bool) {
        self.tableView.reloadData()
    }