应该根据要求执行 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 很好地演示了此后要执行的步骤。您当前的实施不是必需的。