将异步的Alamofire请求变为同步的请求

6

我正在尝试在Swift中执行Alamofire的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
尝试理解异步模式。总有一种方法可以符合它。在您的情况下,实现一个完成块来返回数据,例如 func checkIfUserExistsInDB(userName: String, completion:(String) -> Void) - vadian
你能详细解释一下吗?我对Swift非常陌生。 - mark
我写了一个答案。 - vadian
谢谢,它运行得非常好。 - mark
阅读这里的评论和答案,我想知道:你们测试吗?!集成测试一系列异步请求直接导致回调地狱。此外,当我在(小)脚本中使用Alamofire时,我必须等待,否则主线程(以及程序)将会终止。这不仅仅是应用程序,伙计们... - Raphael
1个回答

3

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

4
我不理解这个问题为什么会获得点赞,它与主题有何关联?原帖问如何将异步请求变成同步请求,回答介绍了使用完成块的方法,但完成块本质上是异步的。 - vishal dharankar
@vishaldharankar 消息是:不要将异步任务变成同步任务。而 OP 明确要求我提供一个带有完成处理程序的解决方案。 - vadian
2
还是一样,这不是对原问题的答案。OP应该将其作为一个不同的问题来提出,这相当具有误导性。 - vishal dharankar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接