For-loop и forEach () получили странное поведение - PullRequest
0 голосов
/ 15 мая 2019

Я делаю 5 запросов, один за другим.Первый запрос - получение идентификатора профиля и токена доступа.А остальные загружают данные для каждого идентификатора профиля.

Я делаю forEach() и запрашиваю данные для каждого идентификатора профиля, который у меня есть.Странные вещи начинаются, когда я перезагружаю данные.В большинстве случаев это правильно, но иногда он сначала получает данные для индекса 1, а затем для 0. И я не могу понять, почему.Я попытался for item in id, и я попытался сохранить идентификаторы профиля в другой массив и использовать его, но он имеет тот же результат.Единственное, что я не пробовал, это точно сказать, какой индекс он должен использовать.Но я не могу понять, как цикл for и запрос работают вместе.Иногда запросы идут один за другим, иногда нет.

self.api.getProfileData(access_token: token) { (profiles, err)  in
    if err != nil {
        print("ERROR: \(err!)")
    } else {
        if let profile = profiles {
            let id = profile[0].data.profiles
            let token = profile[0].data.access_token
            if self.didLogin == true {
                self.profileId = id
            }
            self.group.enter()
            var i = 0
            id.enumerated().forEach({ (index, prof) in
                self.api.getProfiles(token: token!, profileId: prof.id!, completion: { (profileArray) in
                    debugPrint("PROFILES: \(prof.id!) At index: \(index)")
                    if let profileArray = profileArray {
                        self.profile = profileArray
                    }
                    self.api.getMarks(token: token!, profileId: prof.id!, completion: { (marksArray) in
                        debugPrint("MARKS: \(prof.id!) At index: \(index)")
                        if let marksArray = marksArray {
                            self.marks = marksArray
                        }
                        self.api.getBUP(token: token!, profileId: prof.id!, completion: { (bup) in
                            debugPrint("BUP: \(prof.id!) At index: \(index)")
                            if let bup = bup {
                                self.bup = bup
                            }
                            self.api.getRUP(token: token!, profileId: prof.id!, completion: { (rup) in
                                debugPrint("RUP: \(prof.id!) At index: \(index)")
                                if let rup = rup {
                                    self.rup = rup

                                    i += 1
                                    if i == profile[0].data.profiles.count {
                                        self.group.leave()
                                    }
                                }
                            })
                        })
                    })
                })
                self.group.notify(queue: .main, execute: {
                    if i != profile[0].data.profiles.count {
                        i += 1
                    } else {
                        SVProgressHUD.dismiss()
                        UIView.transition(with: self.tableView, duration: 0.2, options: .transitionCrossDissolve, animations: {
                            //                                                if self.didLogin == true {
                            self.tableView.reloadData()
                            //                                                }
                        }, completion: {(completed) in
                            if completed {
                                self.tableView.isUserInteractionEnabled = true
                                self.didLogin = false
                            }
                        })
                    }
                })
            })
        }
    }
}

Я ожидаю что-то вроде:

"PROFILES: 5176 At index: 0"
"PROFILES: 5177 At index: 1"
"MARKS: 5176 At index: 0"
"MARKS: 5177 At index: 1"
"BUP: 5176 At index: 0"
"BUP: 5177 At index: 1"
"RUP: 5176 At index: 0"
"RUP: 5177 At index: 1"

Но я получаю:

"PROFILES: 5176 At index: 0"
"PROFILES: 5177 At index: 1"
"MARKS: 5177 At index: 1"
"MARKS: 5176 At index: 0"
"BUP: 5177 At index: 1"
"BUP: 5176 At index: 0"
"RUP: 5176 At index: 0"
"RUP: 5177 At index: 1"

или

"PROFILES: 5176 At index: 0"
"PROFILES: 5177 At index: 1"
"MARKS: 5177 At index: 1"
"MARKS: 5176 At index: 0"
"BUP: 5176 At index: 0"
"BUP: 5177 At index: 1"
"RUP: 5176 At index: 0"
"RUP: 5177 At index: 1"

1 Ответ

1 голос
/ 16 мая 2019

При звонке

id.enumerated().forEach({ (index, prof) in { ... }

Это asynchronous звонок. Кажется, что в массиве id есть два элемента и два корневых вызова разветвляются из .forEach. Для каждого звонка напечатано 4 логов. четыре бревна для профиля 5176 и другие четыре бревна для профиля 5177.

Вы должны знать, что asynchronous вызов не может гарантировать вам порядок выполнения двух потоков. Это означает, что порядок журналов для профилей 5176 и 5177 не должен быть последовательным, но все журналы в отдельных профилях, то есть 5176, являются последовательными, поскольку они печатаются при каждом завершении.

Пожалуйста, имейте глубокое понимание того, как асинхронный и синхронный поток вызовов работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...