我从Swift3开始,由于异步,我遇到了一个经常出现的问题。但直到现在,我总能找到一个带回调的解决方案。
我有一个textField和一个按钮,当我点击按钮时,如果在textField中有一个名为的现有用户,我会检查API。
使用shouldPerformSegue
,如果用户存在或不,则返回值。
我有一个单独的类来处理Api上的调用
class Api {
static let urlApi = "https://XXXXXXXXXXXXX"
private let CUSTOMER_ID = "XXXXXXXX"
private let CUSTOMER_SECRET = "XXXXXXXX"
private var access_token : String? = nil
private var userInfo : User?
init() {
self.connect()
}
func connect() {
// Do the connect...
}
func get(user: String, callback: @escaping (_ status: Bool) -> Void) {
Alamofire.request(URL(string: "\(Api.urlApi)/v2/users/\(user)")!,
method: .get,
parameters: nil,
encoding: URLEncoding.default,
headers: ["Authorization": "Bearer \(self.access_token!)"])
.responseJSON(completionHandler: { response in
if response.result.isFailure {
print("ERROR: GET USER", response)
callback(false)
} else {
print("SUCCESS Getting user ", user)
callback(true)
}
})
}
}
在我的shouldPerformSegue
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
var userExist : Bool? = nil
let dispatchQueue = DispatchQueue(label: "getUser")
let semaphore = DispatchSemaphore(value: 1)
dispatchQueue.sync {
self.api?.get(user: self.userTextField.text!, callback: { status in
userExist = status
print("1 USEREXIST", userExist)
})
}
semaphore.wait()
print("2 USEREXIST", userExist)
return userExist ?? false // always false because userExist == nil
}
很抱歉功能乱七八糟,我真的找不到正确的方法来{my DispachQueue
和Semaphore
..所有谷歌搜索答案看起来我需要那些
答案 0 :(得分:2)
处理这种情况的正确方法是在用户点击按钮时发出请求。如果出现错误,您将出现一些错误,指出用户名已存在。然后他们会再试一次。
如果请求成功且未使用该用户名,则您可以致电performSegueWithIdentifier
。下面的链接显示了此后要采取的步骤。您当前的实施是没有必要的。