2017-04-20 31 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 ..すべてのグーグル・アンサーが私にそれらが必要だと思わせる

答えて

2

このシナリオを処理する適切な方法はユーザーがボタンをタップしたときにリクエストを行うこと。エラーがある場合は、ユーザー名が既に存在するというエラーが表示されます。その後、彼らは再び試みます。

要求が成功し、そのユーザー名が取得されていない場合は、performSegueWithIdentifierと呼び出します。以下のリンクは、この後に取るべきステップの良いデモンストレーションを示しています。現在の実装は必要ありません。

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

そのためのOK
+0

、私は最初のと同じような知識のために、どのようにそれを行うには? –

+0

@ ale-battあなたがあなたに伝えられないように、あなたのプリントステートメントの結果が何を生成しているのか投稿していません。ユーザーが存在する場合、falseを返すことになります。したがって、技術的には、returnステートメントのロジックが正しくありません。 – jnewkirk

+0

編集!最初のプリントは決して表示されません –

関連する問題