我想使用一些功能。 但它是随机起作用的。
func first() {
// using alamofire
case .success():
...
print("1")
}
func second() {
// using alamofire
...
case .success():
print("2")
tableView.reloadData()
}
@IBAcition func click(_ sender: Any) {
first()
second()
}
如果我点击按钮。 我希望总是打印:1 2。 但它有时会打印 2 1。 我该怎么办?
这是因为您正在使用异步代码,请将
second
函数的调用移动到第一个函数的 .success()
块,如下所示:
func first() {
// using alamofire
case .success():
...
print("1")
second()
}
这样你就可以确保
second
func 仅在 first
func 满足后才被调用
func first(completion: @escaping(_ success:Bool) -> Void) {
// using alamofire
case .success():
print("1")
completion(true)
case .failure():
completion(false)
}
func second(completion: @escaping(_ success:Bool) -> Void) {
case .success():
print("2")
completion(true)
case .failure():
completion(false)
}
@IBAcition func click(_ sender: Any) {
first { success in // first func executed
if success { // first func success is true
second { success in
if success { // second func success is true
print("do something now")
} else {
print("2nd func failed")
}
}
} else {
print("1st func failed")
}
}
}
这更多的是关于异步调用的理解,而不是代码问题。当进行异步调用时,无论是通过网络还是本地的 API 调用,您都无法确定它返回的顺序。
例如,当调用第一个和第二个调用时,第二个调用可能会比第一个调用更早返回。因此造成了您面临的问题。
要解决该问题,您可以尝试 Zeeshan Ahmed
提供的答案