Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.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 Swift 3-等待服务器结果_Ios_Swift_Swift3 - Fatal编程技术网

Ios Swift 3-等待服务器结果

Ios Swift 3-等待服务器结果,ios,swift,swift3,Ios,Swift,Swift3,因为我可以等待服务器返回一个结果,然后执行另一个函数(将使用服务器响应中的数据) 比如: Func A:我从服务器得到响应:responseCode=200,它存储在变量“code”中 Func B:检查变量“code”是否为200 我找不到路,到目前为止,我总是在func B运行之前运行它 多谢各位 @IBAction private func bt_signin () { print("Step 1") func_a(text: url_text) func_b()

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

比如:

Func A:我从服务器得到响应:responseCode=200,它存储在变量“code”中 Func B:检查变量“code”是否为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

您需要将func_b放入func_a的闭包中

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

这样,一旦返回代码,func_b就会运行。您可以在internet上了解有关闭包的更多信息。我建议您先开始

您可以使用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")
        }
    }

函数异步执行任务,它不会等待任务的结果。所以 使用主线程,如下所示

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 code

一样使用完成处理程序,“任务”是异步执行的(很容易解释,func_a将返回/完成,任务将继续在后台运行)。在任务内部调用self.func_b(),当检索到状态码并在Swift中读取了一点async时:)输出是正确的,
URLSession
work async所以
funcB
将首先运行,你不能把
func_b()放在
步骤3
?您必须使用完成处理程序来处理此情况。非常感谢Irshad Ahmed,此解决方案按照我想要的方式工作。我将学习它以更好地理解它,因为我是Swift和iOS应用程序的初学者,我需要学习很多。再次感谢。谢谢格雷格,我是Swift和iOS应用程序的初学者,我需要学习很多。