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搜索的答案看起來我需要那些
好了,只爲知識,就像我首先該怎麼辦呢? –
@ ale-batt您還沒有發佈您的打印報告的結果正在生成,所以我不能告訴你。如果用戶存在,那麼你會想返回false,所以在技術上你的邏輯對於return語句是不正確的。 – jnewkirk
編輯!第一次打印從不出現 –