我如何正确地重新加载我的 UICollectionView 的数据?

How do i correctly reload my UICollectionView's data?

我有一个在我的 collectionView 的 viewDidLoad 中调用的函数,它将内容从我的服务器加载到视图中:

// Load Books Class
    func loadBooks() {

        var query = PFQuery(className: "Books")
        query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in
            if error == nil {
                let bookObjects = objects as! [PFObject]
                for (index, object) in enumerate(bookObjects) {
                    self.books.append(Book(pfBook: object))
                }
            }else if let secondMessage = error?.userInfo?["error"] as? String
                where secondMessage == "The Internet connection appears to be offline." {
                    self.failedMessage(secondMessage)
            }
            dispatch_async(dispatch_get_main_queue()){

            self.collectionView!.reloadData()

            }
        }
    }

这是我在刷新 collectionView 时调用的函数,我基本上是在尝试将项目重新加载回视图:

func startRefresh(){

        dispatch_async(dispatch_get_main_queue()) {
            self.loadBooks()

            println("loading complete!")

            self.refreshControl.endRefreshing()
        }

    }

然而,当我刷新时,它没有再次加载相同的内容,而是加载了两倍的内容。有点像在加载方法之上调用加载方法,而不是重新执行它。看起来按照我的逻辑,我应该怎么做才能解决这个问题?

您应该删除 self.books 的所有子项 self.books.removeAll()self.books.append(Book(pfBook: object))

之前

开始添加项目之前,您需要清除数组。将 self.books.removeAll() 添加到您的代码中,如下所示:

func loadBooks() {

    var query = PFQuery(className: "Books")
    query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in
        if error == nil {
            self.books.removeAll()
            let bookObjects = objects as! [PFObject]
            for (index, object) in enumerate(bookObjects) {
                self.books.append(Book(pfBook: object))
            }
        }else if let secondMessage = error?.userInfo?["error"] as? String
            where secondMessage == "The Internet connection appears to be offline." {
                self.failedMessage(secondMessage)
        }
        self.collectionView!.reloadData()
    }
}

编辑:由于 Parse 回调是 executed on main thread,您不需要代码的 dispatch_async 部分。