Завершение Проблемы - PullRequest
       5

Завершение Проблемы

0 голосов
/ 26 апреля 2018

Итак, я пытаюсь реализовать revelaingSplashView для моего начального контроллера представления.Мой начальный vc имеет несколько вызовов базы данных, которые, кажется, завершаются в странном порядке.После некоторой трассировки я сузил ее до конкретной функции, которая происходит последней, насколько идут блоки завершения.Что я перечислил здесь

@objc func grabFriendsEvents(){
    print("Attempting to see where your friends are going")
    UserService.following { (user) in
        for following in user {
            print(following.username as Any)
            PostService.showFollowingEvent(for: following.uid, completion: { (event) in
                self.friendsEvents.append(event)
               // self.friendsEvents.append(contentsOf: event)
                // leave here
                self.friendsEvents = self.friendsEvents.removeDuplicates()
                print("ending in friends events")
                self.collectionView?.reloadData()
            })

        }  

    }
}

Две вспомогательные функции в реализованных мной методах обслуживания перечислены ниже.

static func following(for user: User = User.current, completion: @escaping ([User]) -> Void) {
    // 1
    let followingRef = Database.database().reference().child("following").child(user.uid)
    followingRef.observeSingleEvent(of: .value, with: { (snapshot) in
        // 2
        guard let followingDict = snapshot.value as? [String : Bool] else {
            return completion([])
        }

        // 3
        var following = [User]()
        let dispatchGroup = DispatchGroup()

        for uid in followingDict.keys {
            dispatchGroup.enter()

            show(forUID: uid) { user in
                if let user = user {
                    following.append(user)
                }

                dispatchGroup.leave()
            }
        }

        // 4
        dispatchGroup.notify(queue: .main) {
            completion(following)
        }
    })
}

Вторая функция перечислена здесь

static func showFollowingEvent(for followerKey: String,completion: @escaping (Event) -> Void) {
    //getting firebase root directory
    let ref = Database.database().reference()

    ref.child("users").child(followerKey).child("Attending").observeSingleEvent(of: .value, with: { (attendingSnapshot) in
        print(attendingSnapshot)
        guard var eventKeys = attendingSnapshot.children.allObjects as? [DataSnapshot] else{return}
        for event in eventKeys{
            let dispatchGroup = DispatchGroup()
            dispatchGroup.enter()
            EventService.show(forEventKey: event.key, completion: { (event) in
                dispatchGroup.leave()
                completion(event!)
            })
        }
    }) { (err) in
        print("couldn't grab event info",err)

    }
}

Теперь grabFriendsEvents возвращается пару раз в зависимости от количества ваших друзей и событий, которые они посещают.Я пытаюсь выяснить способ узнать, когда это будет завершено, чтобы я мог отклонить откровенный взгляд.Я думаю, что диспетчерские группы могли бы быть способом пойти, но я не уверен точно, где поместить это.Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 26 апреля 2018
  1. В grabFriendsEvents: PostService.showFollowingEvent также является асинхронной функцией, вызываемой в цикле, поэтому вам необходимо добавить для нее очередь отправки.

    let dispatchGroup = DispatchGroup()
    for following in user {
        print(following.username as Any)
        dispatchGroup.enter()
        PostService.showFollowingEvent(for: following.uid, completion: { (event) in
            self.friendsEvents.append(event)
           // self.friendsEvents.append(contentsOf: event)
            // leave here
            self.friendsEvents = self.friendsEvents.removeDuplicates()
            print("ending in friends events")
            self.collectionView?.reloadData()
            dispatchGroup.leave()
        })
    
    } 
    dispatchGroup.notify(queue: .main) {
        // dismiss the revealing view
    }
    
  2. В showFollowingEvent вы никогда не вызываете dispatchGroup.notify, поэтому он запускается несколько раз

  3. Я знаю, что это невозможно, но лучше реструктурировать вызовы API

...