2017-04-20 53 views
1

我從Swift3開始,由於異步性,我有一個經常性問題。但直到現在,我總是找到一個回調的解決方案。應該按要求執行segue

我有一個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 
} 

對不起,功能混亂處理呼叫的分離類,我真的不覺得這樣做的正確方法我的DispachQueue和我的Semaphore ..所有使用Google搜索的答案看起來我需要那些

回答

2

處理這種情況的正確方法是在用戶點擊按鈕時發出請求。如果出現錯誤,則會顯示一些說明用戶名已存在的錯誤。然後他們會再試一次。

如果請求成功,並且該用戶名尚未被佔用,那麼您可以撥打performSegueWithIdentifier。下面的鏈接顯示了在此之後要採取的措施的一個很好的示範。您目前的實施並非必要。

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

+0

好了,只爲知識,就像我首先該怎麼辦呢? –

+0

@ ale-batt您還沒有發佈您的打印報告的結果正在生成,所以我不能告訴你。如果用戶存在,那麼你會想返回false,所以在技術上你的邏輯對於return語句是不正確的。 – jnewkirk

+0

編輯!第一次打印從不出現 –