Можете ли вы помочь мне распутать эту пирамиду гибели (обратный вызов ада)? - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь расширить свои навыки кодирования, и недавно я читал о том, как избежать ада обратного вызова, используя DispatchGroup () и Semaphores ().

Может кто-нибудь помочь мне с примерами о том, как распутать эту функцию, которая выполняет несколько сетевых вызовов после завершения предыдущего?

Код выглядит следующим образом:

    func fetchFollowingUsersAndUpdateCollectionView() {
    UserService.shared.fetchCurrentUsersContacts { (result) in

        switch result {
        case .success(let contactUid):

            UserService.shared.fetchUserInfo(userUid: contactUid) { (resultUserInfo) in

                switch resultUserInfo {
                case .success(let dict):
                    guard
                    let fullname = dict["fullname"],
                    let profileImageUrl = dict["profileImageUrl"]
                    else { return }

                    DispatchQueue.main.async {
                        UserService.shared.downloadAndCreateImage(url_String: profileImageUrl) { (imageResult) in

                            switch imageResult {
                            case .success(let profileImage):
                                let dispatchGroup = DispatchGroup()

                                dispatchGroup.notify(queue: .main) {
                                let user = User(uid: contactUid, fullname: fullname, profileImage: profileImage, isFollowed: true)
                                self.contactsArray.append(user)
                                self.selectUserCollectionView.reloadData()
                                }

                            case .failure(let imageResultError):
                                print(imageResultError.localizedDescription)
                            }
                        }
                    }



                case .failure(let userInfoError):
                    print(userInfoError.localizedDescription)
                }
            }

        case .failure(let resultError):
            print(resultError.localizedDescription)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...