使异步alamofire请求同步

时间:2016-04-25 15:49:22

标签: ios swift asynchronous alamofire synchronous

我正试图在swift中执行alamofire post post请求

func checkIfUserExistsInDB(userName: String) -> NSString
{

  print ("IN")
  var info: NSString = ""

  Alamofire.request(.POST, "http://blablabla.com/getuserdata", parameters: ["queryValue": userName,], encoding:.JSON).responseJSON { request, response, result in
    switch result {
    case .Success(let JSON):
        info = NSString(data: JSON.dataUsingEncoding(NSUTF8StringEncoding)!, encoding: NSUTF8StringEncoding)!

    case .Failure(let data, _):
        print ("IN")
        if let data = data {
            info = (NSString(data: data, encoding: NSUTF8StringEncoding)!)

            print (info)
        }

    }
  }

  return info
}

但我遇到麻烦同步。我知道制作异步功能(如Alamorfire提供的功能)通常不被接受,但在我的情况下,我必须同步进行。

1 个答案:

答案 0 :(得分:6)

在Swift中实现完成块非常容易。

这是具有完成块的功能

func checkIfUserExistsInDB(userName: String, completion:(String) -> Void)
{
  Alamofire.request(.POST, "http://blablabla.com/getuserdata", parameters: ["queryValue": userName,], encoding:.JSON).responseJSON { request, response, result in
    switch result {
    case .Success(let JSON):
      let info = String(data: JSON.dataUsingEncoding(NSUTF8StringEncoding)!, encoding: NSUTF8StringEncoding)!
      completion(info)

    case .Failure(let data, _):
      if let errorData = data, info = String(data: errorData, encoding: NSUTF8StringEncoding) {
        completion(info)
      }
    }
  }
}

可以调用(info是异步返回的字符串)

checkIfUserExistsInDB("string") { (info) in
  print(info)
}