UITableView在使用SwiftyJSON和Alamofire返回的API数据之前呈现

时间:2015-04-19 09:45:08

标签: swift alamofire swifty-json

当我在viewDidLoad()中调用callapi()函数时,callapi中的println()打印其中包含Post对象的posts数组,但viewDidLoad()函数中的println()会打印一个空数组。此外,当我构建项目时,我收到此错误“致命错误:数组索引超出范围”。 tableView函数中的println()语句也打印一个空数组。似乎在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
}

3 个答案:

答案 0 :(得分:2)

调用viewDidLoad时,它会启动异步callapi,但到viewDidLoad完成时,posts仍为空。但是表格视图仍然会继续其初始加载过程,即使尚未填充posts,因此您必须确保tableView:numberOfRowsInSection:此时返回零。

稍后,callapi完成了Alamofire GET请求并致电reloadData。只有在此时{@ 1}}才会返回非零值。

最重要的是,请确保tableView:numberOfRowsInSection:返回tableView:numberOfRowsInSection:中的实际条目数,然后才能解决问题。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

确保你设置tableView:numberOfRowsInSection:返回self.posts.count