Swift 3 - 等待服务器结果

时间:2017-07-13 09:47:25

标签: ios swift swift3

因为我可以等待服务器返回结果然后再执行另一个函数(它将使用来自服务器响应的数据)。

类似的东西:

Func A:我从服务器得到响应:responseCode = 200,它存储在一个变量" code" 功能B:检查变量"代码"是200。

我找不到方法,到目前为止,我总是在运行之前运行func B.

非常感谢。

 @IBAction private func bt_signin () {
    print("Step 1")
    func_a(text: url_text)
    func_b()
}


private func func_a(text: String) {

print("Step 2")

let url = NSURL(string: text)
let request = NSMutableURLRequest(url: url! as URL)

let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in
    guard error == nil && data != nil else
    {
        print("Error: ", error)
        return
    }

    let httpStatus = response as? HTTPURLResponse

    if httpStatus!.statusCode == 200
    {
        self.responseCode = httpStatus!.statusCode
        print("Step 3")                
    }
}
task.resume()
}

 func func_b (){
    print("Step 4")
    if (responseCode == 200) {
        print("Step 5")
    }
    }

我得到以下内容:

Step 1
Step 2
Step 4
Step 3

3 个答案:

答案 0 :(得分:3)

您可以使用Closer来实现此更改

@IBAction private func bt_signin () {
        print("Step 1")
        func_a(text: "") { (isSuccess) in
           self.func_b()
        }
    }


    private func func_a(text: String , _ completion:@escaping (_ isSuccess:Bool)->Void) {

        print("Step 2")

        let url = NSURL(string: text)
        let request = NSMutableURLRequest(url: url! as URL)

        let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in
            guard error == nil && data != nil else
            {
                print("Error: ", error)
                DispatchQueue.main.async {
                   completion(false)
                }

                return
            }

            let httpStatus = response as? HTTPURLResponse

            if httpStatus!.statusCode == 200
            {
                self.responseCode = httpStatus!.statusCode
                DispatchQueue.main.async {
                    completion(false)
                }
                print("Step 3")
            }
        }
        task.resume()
    }

    func func_b (){
        print("Step 4")
        if (responseCode == 200) {
            print("Step 5")
        }
    }

答案 1 :(得分:0)

你需要将func_b放在func_a

的闭包中
...
if httpStatus!.statusCode == 200
{
    self.responseCode = httpStatus!.statusCode 
    print("Step 3")
    self.func_b                
}

这样一旦返回代码,func_b就会运行。您可以了解有关互联网闭包的更多信息。我建议this video作为开始

答案 2 :(得分:0)

function一个异步执行的任务,它不会等待tasks.so的结果 使用下面的主线程

DispatchQueue.main.async { 
   if httpStatus!.statusCode == 200
   {
       self.responseCode = httpStatus!.statusCode
       print("Step 3")        
       func_b()        // here call wanna perform any UI updates 
   }
}

您也可以像@Irshad Ahmed代码一样使用完成处理程序