2017-07-11 34 views
0

这是问题所在。收集查看时排序未排序的数组

创建一个json对象数组后,我对它们进行排序。当我加载控制器时,集合视图会闪烁未排序的数组,然后显示已排序的数组(请参阅下面的演示)。

CollectionView Flicker Problem Demo

我试过的要对这个问题的一些方法。

  1. GCD首先完成排序,然后重新加载收集视图。

  2. GCD删除数组,然后继续请求。

  3. Dispatch异步排序和集合视图重新加载。

这里是我的代码

ref.observeSingleEvent(of: .value, with: { (snapshot) in 

     self.collectionView?.refreshControl?.endRefreshing() 

     guard let dictionaries = snapshot.value as? [String: Any] else { return } 

     dictionaries.forEach({ (key, value) in 
      guard let dictionary = value as? [String: Any] else { return } 

      var post = Post(user: user, dictionary: dictionary) 
      post.id = key 

      self.posts.sort(by: { (p1, p2) -> Bool in 
       return p1.creationDate.compare(p2.creationDate) == .orderedDescending 
      }) 
      self.posts.append(post) 
      self.collectionView?.reloadData() 

     }, withCancel: { (err) in 
      print("Failed to fetch like info for post:", err) 
     }) 
    }) 

我真的不知道自己还能做些什么。任何想法?

回答

1

在每次更新之后,您正在告诉集合视图更新其内容(通过调用reloadData())。这会导致闪烁。为防止出现这种情况,只有在完成所有更新后才告诉集合视图进行更新:

ref.observeSingleEvent(of: .value, with: { (snapshot) in 

    self.collectionView?.refreshControl?.endRefreshing() 

    guard let dictionaries = snapshot.value as? [String: Any] else { return } 

    dictionaries.forEach({ (key, value) in 
     guard let dictionary = value as? [String: Any] else { return } 

     var post = Post(user: user, dictionary: dictionary) 
     post.id = key 

     self.posts.sort(by: { (p1, p2) -> Bool in 
      return p1.creationDate.compare(p2.creationDate) == .orderedDescending 
     }) 
     self.posts.append(post) 

    }, withCancel: { (err) in 
     print("Failed to fetch like info for post:", err) 
    }) 
    self.collectionView?.reloadData() 
}) 
+0

解决了这个问题!我也有一个方法,在获取请求中有一个获取请求..同样的问题依然存在..任何想法我可以解决这个问题? – user7045671