CollectionView在刷新reloadData时闪现

我有一个收集查看,其中约60个图像从parsing下载。 这些图像可以更新,取决于是否有新的上传。

但我的问题是我加载视图后,我使用PullToRefresh函数刷新数据,集合视图闪烁白色 ,然后再次显示图像…

这里有一个video向你展示:

https://www.youtube.com/watch?v=qizaAbUnzYQ&feature=youtu.be

我一直试图解决这一整天,find一个解决scheme,但我没有成功..!

下面是我如何查询图像:

func loadPosts() { self.activityView.startAnimating() let followQuery = PFQuery(className: "Follows") followQuery.whereKey("follower", equalTo: PFUser.currentUser()!.username!) followQuery.findObjectsInBackgroundWithBlock ({ (objects:[PFObject]?, error:NSError?) -> Void in if error == nil { self.followArray.removeAll(keepCapacity: false) for object in objects! { self.followArray.append(object.valueForKey("following") as! String) } let query = PFQuery(className: "Posts") query.limit = self.page query.whereKey("username", notContainedIn: self.followArray) query.whereKey("username", notEqualTo: PFUser.currentUser()!.username!) query.findObjectsInBackgroundWithBlock ({ (objects:[PFObject]?, error:NSError?) -> Void in if error == nil { self.postImage.removeAll(keepCapacity: false) self.uuidArray.removeAll(keepCapacity: false) self.usernameArray.removeAll(keepCapacity: false) for object in objects! { self.postImage.append(object.valueForKey("image") as! PFFile) self.uuidArray.append(object.valueForKey("uuid") as! String) self.usernameArray.append(object.valueForKey("username") as! String) } } else { print(error!.localizedDescription) } self.collectionView.reloadData() self.refresher.endRefreshing() self.activityView.stopAnimating() self.boxView.removeFromSuperview() }) } }) } 

下面是我如何刷新:

 override func viewDidLoad() { super.viewDidLoad() refresher.addTarget(self, action: "reload", forControlEvents: UIControlEvents.ValueChanged) collectionView.addSubview(refresher) loadPosts() } func reload() { collectionView.reloadData() refresher.endRefreshing() } 

我假设每个post的UUID都是唯一的,所以你可以检查前一次加载的计数是否与当前的不同,然后你可以看到哪些post是新的,找出它们的索引path,然后只重新加载这些索引path。 我用集合来确定哪些id已被添加,这将工作假设你不想显示相同的职位两次。 可能有更好的办法,但总的来说,你需要做一些类似于以下的事情:

  func loadPosts() { self.activityView.startAnimating() let followQuery = PFQuery(className: "Follows") followQuery.whereKey("follower", equalTo: PFUser.currentUser()!.username!) followQuery.findObjectsInBackgroundWithBlock ({ (objects:[PFObject]?, error:NSError?) -> Void in if error == nil { self.followArray.removeAll(keepCapacity: false) for object in objects! { self.followArray.append(object.valueForKey("following") as! String) } let query = PFQuery(className: "Posts") query.limit = self.page query.whereKey("username", notContainedIn: self.followArray) query.whereKey("username", notEqualTo: PFUser.currentUser()!.username!) query.findObjectsInBackgroundWithBlock ({ (objects:[PFObject]?, error:NSError?) -> Void in if error == nil { let oldUUIDArray = self.uuidArray self.postImage.removeAll(keepCapacity: false) self.uuidArray.removeAll(keepCapacity: false) self.usernameArray.removeAll(keepCapacity: false) for object in objects! { self.postImage.append(object.valueForKey("image") as! PFFile) self.uuidArray.append(object.valueForKey("uuid") as! String) self.usernameArray.append(object.valueForKey("username") as! String) } let uuidOldSet = Set(oldUUIDArray) let uuidNewSet = Set(self.uuidArray) let missingUUIDs = uuidNewSet.subtract(uuidOldSet) let missingUUIDArray = Array(missingUUIDs) let missingUUIDIndexPaths = missingUUIDArray.map{NSIndexPath(forItem:self.uuidArray.indexOf($0)!,inSe ction:0)} let extraUUIDs = uuidOldSet.subtract(uuidNewSet) let extraUUIDArray = Array(extraUUIDs) let extraUUIDIndexPaths = extraUUIDArray.map{NSIndexPath(forItem:oldUUIDArray.indexOf($0)!,inSection:0)} self.collectionView.performBatchUpdates({ if extraUUIDIndexPath != nil { self.collectionView.deleteItemsAtIndexPaths(extraUUIDIndexPaths) } if missingUUIDIndexPaths != nil {self.collectionView.insertItemsAtIndexPaths(missingUUIDIndexPaths)} }, completion: nil) } else { print(error!.localizedDescription) } self.refresher.endRefreshing() self.activityView.stopAnimating() self.boxView.removeFromSuperview() }) } }) } func reload() { self.loadPosts() refresher.endRefreshing() }