table view.reloadData() 在 table 视图中不起作用

table view.reloadData() doesn't work within the table view

table view.reloadData() 在我更改视图控制器并返回后更新 table 视图。我添加了拉动刷新功能:

    lazy var refreshControl: UIRefreshControl = {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
    refreshControl.backgroundColor = UIColor.purpleColor()
//        dispatch_async(dispatch_get_main_queue(), { () -> Void in
//            self.tableView.reloadData()
//        })
    return refreshControl
    }()

这在任何方法之外。然后在viewdidload():

    override func viewDidLoad() {
        self.tableView.addSubview(self.refreshControl)
 }

handleRefresh 函数是这样的:

    func handleRefresh(refreshControl: UIRefreshControl) {
    // Do some reloading of data and update the table view's data source
    // Fetch more objects from a web service, for example...
    fetch()    // Fetches new data

    refreshControl.endRefreshing()
    self.tableView.reloadData()
}

这有效,但只有在我退出视图控制器并返回之后。我认为问题在于用于填充 table 视图单元格的数组是一个全局数组,这意味着它是在与导入语句相同的范围内声明的,但我不确定。我想要一些关于如何在 "refresh" 视图被拉动后立即刷新 table 视图的建议。

这是我的获取代码:

func fetch(){
    var query = PFQuery(className:"Photo")
    query.whereKey("friend", equalTo:"bob")
    query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) -> Void in
        if error == nil {
            // The find succeeded.
            self.getImageData(objects as [PFObject])
            if let objects = objects as? [PFObject] {
                PhotoInfoArray = objects  // This is the global array that stores photo information, date created, etc.
            }
        } else {
            println("Error: \(error!) \(error!.userInfo!)")
        }
    }
}

func getImageData(objects: [PFObject]) {
    for object in objects {

        let thumbNail = object["Image"] as PFFile


        thumbNail.getDataInBackgroundWithBlock({
            (imageData: NSData!, error: NSError!) -> Void in
            if (error == nil) {
                let image = UIImage(data:imageData)
                //image object implementation
                imageArray.append(image!)// this is the global array that stores the actual pictures
                //                    println(image)
            }

        })//getDataInBackgroundWithBlock - end
    }//for - end
}

这些函数使用 Parse 作为后端。

tableView 具有重新加载它的内置功能,在第一个视图中将显示前 20 个项目已加载,然后,当您滚动 table 时,另外 20 个项目被加载到 table ,所有的方法都被再次调用。所以不需要使用刷新。

我认为跟踪数组中的实际内容可能是个好主意,因为我从未见过 self.tableView.reloadData() 不起作用的情况。
我建议在 viewWillAppear 或 viewDidAppear 中打印数组。

如果您需要像这样等待其他进程完成,那么添加一个成功调用可能会很方便:

    func someFunction(success: ((success: Bool) -> Void))) {
        //Perform some tasks here
        success(success: true)
    }

然后在 viewcontroller 中预期结果如下所示:

    someFunction({ (bool) -> Void in 
       if bool {
          self.tableView.reloadData()
       }
    })

您的获取调用很可能是异步的(在后台完成),因此当您的代码点击 reloadData 时,尚未收到数据。您当前的代码取决于同步执行。 因此,您想在 fetch 调用的回调(或委托方法)中执行 reloadData 调用。也许研究一下最适合这类事情的闭包。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

也许你可以展示一些你的抓取代码..