gpt4 book ai didi

php - Swift - 在继续之前等待 "dataTaskWithRequest"响应

转载 作者:行者123 更新时间:2023-11-30 13:21:35 25 4
gpt4 key购买 nike

我知道这个问题之前已经被问过几十次了,但不幸的是我对 Swift 的了解不够,无法根据我的问题调整这些答案。

基本上,我有一个函数可以向服务器上的 php 脚本发送 POST 请求,但接收响应的时间似乎比我的脚本利用结果的时间要长。它发送一个数字变量并接收一个作为响应,因此我还将其从“any_object”转换为“NSNumber”。据我了解,我需要实现一个完成处理程序,但我似乎无法弄清楚如何让它与下面的代码一起工作。

var dataResult: Int = 0
var dataReceived: NSNumber?

func remoteRand() {
let dataToSend = 1
let myUrl = NSURL(string: "http://localhost/scripts/phpScript.php")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let postString = "dataToSend =\(dataToSend)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in

dispatch_async(dispatch_get_main_queue()) {

if (error != nil) {
self.displayAlertMessage((error?.localizedDescription)!)
return
}
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary

if let parseJSON = json {
let dataReceived = parseJSON["dataValue"]
self.dataResult = (dataReceived as! NSNumber).integerValue
print("\(self.dataResult) is server response")
}
} catch { print(error)}
}
}
task.resume()
processResult()
}

func processResult() {
print(dataResult)
}

我得到的结果是:

0
1 is server response

如何让它在继续下一个函数之前等待响应或在确认完成后触发下一个函数?

提前致谢!

最佳答案

该任务在与调用它的线程不同的线程上完成,这是设计使然,因此网络请求不会停止在主线程上执行。因此,您的代码块将异步发送,并在网络请求完成之前调用 processResult。您可以将调用放在 do block 中,或者为可以调用的方法添加闭包。

func remoteRand(completion: (response: Int) ->()) {

// your code
// process JSON
// get value
completion(dataReceived)
// is passed back, just like the dataTaskWithRequest method to your caller where you can set the property on self, etc.
}

在某处使用它:

remoteRand { [weak self] (response) in 
self?.dataResult = response
}

关于php - Swift - 在继续之前等待 "dataTaskWithRequest"响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com