私は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
..すべてのグーグル・アンサーが私にそれらが必要だと思わせる
、私は最初のと同じような知識のために、どのようにそれを行うには? –
@ ale-battあなたがあなたに伝えられないように、あなたのプリントステートメントの結果が何を生成しているのか投稿していません。ユーザーが存在する場合、falseを返すことになります。したがって、技術的には、returnステートメントのロジックが正しくありません。 – jnewkirk
編集!最初のプリントは決して表示されません –