应根据要求执行segue

时间:2017-04-20 17:41:44

标签: swift asynchronous swift3 alamofire grand-central-dispatch

我从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 DispachQueueSemaphore ..所有谷歌搜索答案看起来我需要那些

1 个答案:

答案 0 :(得分:2)

处理这种情况的正确方法是在用户点击按钮时发出请求。如果出现错误,您将出现一些错误,指出用户名已存在。然后他们会再试一次。

如果请求成功且未使用该用户名,则您可以致电performSegueWithIdentifier。下面的链接显示了此后要采取的步骤。您当前的实施是没有必要的。

https://stackoverflow.com/a/37823730/653839