func loadFeed()

in FriendlyPix/FPFeedViewController.swift [378:456]


  func loadFeed() {
    if observers.isEmpty && !posts.isEmpty {
      if let spinner = spinner {
        removeSpinner(spinner)
      }
      for post in posts {
        postsRef.child(post.postID).observeSingleEvent(of: .value, with: {
          if $0.exists() && !self.appDelegate.isBlocked($0) {
            self.updatePost(post, postSnapshot: $0)
            self.listenPost(post)
          } else {
            if let index = self.posts.firstIndex(where: {$0.postID == post.postID}) {
              self.posts.remove(at: index)
              self.loadingPostCount -= 1
              Crashlytics.crashlytics().setCustomValue(self.posts.count, forKey: "updateDeletes")
              self.collectionView?.deleteItems(at: [IndexPath(item: index, section: 0)])
              if self.posts.isEmpty {
                self.collectionView?.backgroundView = self.emptyHomeLabel
              }
            }
          }
        })
      }
    } else {
      var query = self.query?.queryOrderedByKey()
      if let queryEnding = nextEntry {
        query = query?.queryEnding(atValue: queryEnding)
      }
      loadingPostCount = posts.count + FPFeedViewController.postsPerLoad
      query?.queryLimited(toLast: FPFeedViewController.postsLimit).observeSingleEvent(of: .value, with: { snapshot in
        if let spinner = self.spinner {
          self.removeSpinner(spinner)
        }
        if let reversed = snapshot.children.allObjects as? [DataSnapshot], !reversed.isEmpty {
          self.collectionView?.backgroundView = nil
          self.nextEntry = reversed[0].key
          var results = [Int: DataSnapshot]()
          let myGroup = DispatchGroup()
          let extraElement = reversed.count > FPFeedViewController.postsPerLoad ? 1 : 0
          self.collectionView?.performBatchUpdates({
            for index in stride(from: reversed.count - 1, through: extraElement, by: -1) {
              let item = reversed[index]
              if self.showFeed {
                self.loadPost(item)
              } else {
                myGroup.enter()
                let current = reversed.count - 1 - index
                self.postsRef.child(item.key).observeSingleEvent(of: .value) {
                  results[current] = $0
                  myGroup.leave()
                }
              }
            }
            myGroup.notify(queue: .main) {
              if !self.showFeed {
                for index in 0..<(reversed.count - extraElement) {
                  if let snapshot = results[index] {
                    if snapshot.exists() {
                      self.loadPost(snapshot)
                    } else {
                      self.loadingPostCount -= 1
                      self.database.reference(withPath: "feed/\(self.uid)/\(snapshot.key)").removeValue()
                    }
                  }
                }
              }
            }
          }, completion: nil)
        } else if self.posts.isEmpty && !self.showFeed {
          if self.isFirstOpen {
            self.feedAction()
            self.isFirstOpen = false
          } else {
            self.collectionView?.backgroundView = self.emptyHomeLabel
          }
        }
      })
    }
  }