【问题标题】:How to Wait async api response using Alamofire and Rxswift?如何使用 Alamofire 和 Rxswift 等待异步 api 响应?
【发布时间】:2017-12-17 18:44:04
【问题描述】:

我对异步 api 有疑问。
我可以等待异步 api 得到响应吗?
就我而言,我希望在“isAgreen == true”时向用户显示警报控制器。
我不知道该怎么做。
谢谢。

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)
     }
   }
}

【问题讨论】:

  • 即使没有 RXSwift,您也不会等待;您将让异步代码调用完成处理程序。 RXSwift 就是关于事件驱动的。当网络操作完成时,某些对象应该发出一个事件,您将处理该事件。
  • 你的问题解决了吗?

标签: ios swift asynchronous alamofire rx-swift


【解决方案1】:

您可以使用响应式方式(RxSwift)实现您的功能,如下所示。

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)

希望能帮到你。

【讨论】:

    【解决方案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)
        })
    }
    

    调用看起来像:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2013-08-29
      • 2017-01-03
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      相关资源
      最近更新 更多