Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使异步alamofire请求同步_Ios_Swift_Asynchronous_Alamofire_Synchronous - Fatal编程技术网

Ios 使异步alamofire请求同步

Ios 使异步alamofire请求同步,ios,swift,asynchronous,alamofire,synchronous,Ios,Swift,Asynchronous,Alamofire,Synchronous,我试图在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

我试图在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提供的函数)并不被普遍接受,但在我的情况下,我必须同步执行。

在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
是异步返回的字符串)调用


尝试理解异步模式。总有一种方法可以遵循它。在您的例子中,实现一个完成块来返回数据,例如
func checkIfUserExistsInDB(用户名:String,完成:(String)->Void)
您能详细说明一下吗?我对swiftI很陌生,我写了一个答案。谢谢,伙计,它真的很有效。阅读这里的评论和答案我想知道:你们有测试吗?!集成测试一系列异步请求直接导致回调地狱。另外,当我在(小)脚本中使用Alamofire时,我必须等待,否则主线程(以及程序)将终止。不仅仅是应用程序,伙计们……我不明白这个问题的重要性,它到底有什么关系?OP询问如何使异步请求同步,回答说明如何使用完成块,它们本质上是异步的。@vishaldharankar消息是:不要使异步任务同步。OP明确要求我提供一个带有完成处理程序的解决方案。仍然是一样的,它不是对原始问题的回答,OP应该把它作为一个不同的问题来问,相当误导,它不是一个同步请求。。。
checkIfUserExistsInDB("string") { (info) in
  print(info)
}