我如何正确地重新加载我的 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
部分。
我有一个在我的 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
部分。