我正在进行5个请求,一个接一个。第一个请求是获取配置文件ID和访问令牌。其他人正在下载每个配置文件ID的数据。
我正在做forEach()
,并为我拥有的每个个人资料ID请求数据。当我重新加载数据时,奇怪的事情开始了。多数情况下是正确的,但有时它首先获取索引1的数据,然后获取0的数据。我不明白为什么。我尝试了for item in id
,并尝试将配置文件ID保存到另一个数组中并使用它,但结果相同。我没有尝试过的是确切告诉它应该使用什么索引。但是我不明白for循环和请求如何协同工作。有时请求接after而至,有时却没有。
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"
答案 0 :(得分:1)
致电时,
styles
它是一个id.enumerated().forEach({ (index, prof) in { ... }
呼叫。似乎id数组中有两个元素,并且从.forEach中分支出两个根调用。对于每个呼叫,将打印4条日志。配置文件5176的四个日志,配置文件5177的其他四个日志。
您应该知道asynchronous
调用不能保证您执行两个线程的顺序。这意味着配置文件5176和5177的日志顺序不希望是连续的,但是单个配置文件(即5176)下的所有日志都是顺序的,因为它们是在每次完成时打印的。
请深入了解asynchronous and synchronous呼叫流程的工作原理。