应该根据要求执行 segue
Should perform segue on request
我从 Swift3 开始,由于异步,我经常遇到问题。但直到现在,我总是找到回调的解决方案。
我有一个 textField 和一个按钮,当我点击按钮时,我会检查 API 是否存在名为 textField 的现有用户。
使用 shouldPerformSegue
,我 return 用户存在或不存在时的值。
我有一个单独的 class 用于处理 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
}
抱歉功能混乱,我真的没有找到正确的方法来做我的 DispachQueue
和我的 Semaphore
..所有谷歌搜索答案看起来我需要那些
处理这种情况的正确方法是在用户点击按钮时发出请求。如果出现错误,您会出现一些错误,表明用户名已存在。然后他们会再试一次。
如果请求成功并且该用户名尚未被使用,那么您将调用 performSegueWithIdentifier
。下面的 link 很好地演示了此后要执行的步骤。您当前的实施不是必需的。
我从 Swift3 开始,由于异步,我经常遇到问题。但直到现在,我总是找到回调的解决方案。
我有一个 textField 和一个按钮,当我点击按钮时,我会检查 API 是否存在名为 textField 的现有用户。
使用 shouldPerformSegue
,我 return 用户存在或不存在时的值。
我有一个单独的 class 用于处理 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
}
抱歉功能混乱,我真的没有找到正确的方法来做我的 DispachQueue
和我的 Semaphore
..所有谷歌搜索答案看起来我需要那些
处理这种情况的正确方法是在用户点击按钮时发出请求。如果出现错误,您会出现一些错误,表明用户名已存在。然后他们会再试一次。
如果请求成功并且该用户名尚未被使用,那么您将调用 performSegueWithIdentifier
。下面的 link 很好地演示了此后要执行的步骤。您当前的实施不是必需的。