Swift & PromiseKit, изменение объекта внутри zip-тела не изменяет окончательный массив - PullRequest
0 голосов
/ 29 апреля 2020

, так что у меня в руках довольно сложный сценарий, он выглядит примерно так:

  1. Массив выборки "репозиторных" сущностей
  2. Анализ массива репозитория
  3. Для каждой сущности репозитория необходимо выбрать ветви
  4. После того, как ветви были выбраны, измените исходные репозитории, прикрепив соответствующие ветви к каждому
  5. Верните конечный объект со всеми их свойствами

Итак, код выглядит примерно так:

    func fetchRepos(token: Token) -> Promise<[Repo]> {
        return Promise { seal in
            guard let url = URL([SOME_URL])...

            var request = URLRequest(url: url)
            request.addValue(token.token, forHTTPHeaderField: "X-API-Token")
            request.addValue("application/json", forHTTPHeaderField: "accept")

            URLSession.shared.dataTask(with: request) { (data, _, error) in
                if error == nil {
                    do {
                        let reposDto = try self.decoder.decode([RepoDto].self, from: data!)

                        var repos = reposDto.map { dto in DtoMapper.mapRepoDto(dto, token: token) }

                        firstly {
                            when(resolved: repos.map { self.fetchRepoBranches(token: token, repo: $0) })
                        }.done { branchMatrix in

                            for (repo, result) in zip(repos, branchMatrix) {
                                var repo = repo
                                switch result {
                                case .fulfilled(let branches):
                                    repo.branches = branches // THIS STEP IS NOT WORKING
                                    repo.owner = "TEST" // ALSO DOES NOT WORK
                                    print("inserting branches into repo", repo, branches)
                                case .rejected:
                                    print("Repo branches could not be inserted \(repo.name)")
                                }
                            }
                            print("Repos have been fulfilled", repos)
                            seal.fulfill(repos)
                        }
                    } catch {
                        print("Error parsing Repos")
                        seal.reject(error)
                    }
                } else {
                    seal.reject(error!)
                }
            }.resume()
        }
    }

Итак, весь код компилируется и запускается, но когда я пытаюсь назначить ветви, объект репо не видоизменяется, окончательная печать все еще печатает исходный массив объектов без каких-либо вставленных / обновленных свойств, что я здесь не так делаю?

1 Ответ

1 голос
/ 29 апреля 2020

За свою жизнь я не мог найти, как изменить исходный массив репо, поэтому я пошел с потоком и просто создал новый массив (так как zip создает новую копию):

                  firstly {
                            when(resolved: repos.map { self.fetchBranch(token: token, repo: $0) })
                        }.done { branchMatrix in
                            var newRepos = [Repo]()
                            for (repo, result) in zip(repos, branchMatrix) {
                                var repo = repo
                                switch result {
                                case .fulfilled(let branches):
                                    repo.branches = branches
                                    newRepos.append(repo)
                                case .rejected:
                                    print("Repo branches could not be inserted")
                                }
                            }

                            seal.fulfill(newRepos)
...