2017-07-13 1 views
0

私は非同期APIに関する質問があります。
レスポンスを得るにはasync apiを待つことができますか?
私の場合、「isAgreen == true」と表示し、alertcontrollerをユーザーに表示します。
私はそれを行う方法を知らない。
ありがとうございます。
AlamofireとRxswiftを使用して非同期API応答を待つ方法

Class UserModel:NSObject { 

var isAgree:Bool? 

func put(_ params:[String:Any], _ callback: @escaping (JSON) -> Void){ 

let url = self.customUrl(params) 
self.requestJSON(.put, url: url, params: params, callback: { json in 
    callback(json) 
}) 
} 

func getStatus() { 

    API.getUserStatus.put(params, { json in 

     guard json["status"] != "error" else { 

      if json["error"] == "friend agree" { 

       self.isAgreen = true 

       self.friendship.updateDatabase() 
      } 
      return 
     } 
    }) 
    } 
} 


class FriendInfoViewController: UIViewController { 

func buttonClick(sender:UIButton) { 

    let user:UserModel = UserModel() 
    user.getStatus() 

    if user.isAgreen == true{ //Wait to response and show alertViewController 

     let alert = showAlert(title: "Warning", message: "Test", style: .alert) 
     self.present(alert, animated: true, completion: nil) 
    } 
    } 
} 
+0

RXSwiftを使用しなくても、待つことはありません。非同期コードが完了ハンドラを呼び出させるようにします。 RXSwiftは全てイベント駆動型です。一部のオブジェクトは、ネットワーク操作が完了し、そのイベントを処理するときにイベントを送出する必要があります。 – Paulw11

+0

あなたは問題を解決しましたか? – Jaydeep

答えて

2

あなたはグローバル変数を設定しないでください。代わりに、get StatusメソッドでcomletionHandlerを使用します。あなたは以下のような反応方法(RxSwift)を使用して機能を実装することができます

user.getStatus() { isAgreen in 
    if isAgreen { 
     // do your stuff if user is logged in 
    } else { 
     // do your stuff if not logged in 
    } 
} 
2

:呼び出しは次のようになり

func getStatus(_ completionHandler: @escaping (Bool) -> Void) { 

    API.getUserStatus.put(params, { json in 

     guard json["status"] != "error" else { 

      if json["error"] == "friend agree" { 


       self.friendship.updateDatabase() 
       completionHandler(true) 
      } 
      completionHandler(false) 
     } 
     completionHandler(true) 
    }) 
} 

:それは次のようになります。

func getStatus() -> Observable<Bool> { 

     return Observable.create({ (observer) -> Disposable in 

      API.getUserStatus.put(params, { json in 

       guard json["status"] != "error" else { 

        if json["error"] == "friend agree" { 

         observer.onNext(true) 
         self.friendship.updateDatabase() 
        } else { 
         observer.onNext(false) 
        } 
       } 
       observer.onNext(true) 

       //Error event which occurred in your request 
       //observer.onError(Error) 

       observer.onCompleted() 
      }) 

      return Disposables.create() 
     }) 
    } 

そして、あなたは以下のように呼び出して、結果を得るカント:

let user:UserModel = UserModel() 
let bag = DisposeBag() 

user.getStatus().subscribe(onNext: { (isAgreen) in 
      if isAgreen { 
       let alert = showAlert(title: "Warning", message: "Test", style: .alert) 
       self.present(alert, animated: true, completion: nil) 
      } 

     }, onError: { (error) in 
      //Do stuff when error Event occurred 
     }, onCompleted: { 
      //Do stuff when Complete Event occurred 
     }).addDisposableTo(bag) 

希望がお手伝いします。

関連する問題