gpt4 book ai didi

ios - 在swift中调用webservice后从异步调用函数返回数据并保存变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:58:06 25 4
gpt4 key购买 nike

我的代码可以工作,但无法保留变量中返回的内容。我只能打印但不能作为将它们存储在变量中的调用。我附加了用于 web 服务的类,因为我现在正在调用对象。

class WebService{

class func llamarWebService(completionHandler: (datos:NSArray)->()){

let urlPath = "http://aaaaaaaaa.com.ar/aaaaaaaaa/forwarder_number?phone=0000000000"
let url = NSURL(string: urlPath)
let session = NSURLSession.sharedSession()
var arreglo:NSArray!
let task = session.dataTaskWithURL(url!,completionHandler: {data,response,error -> Void in

if (error != nil){
print(error?.localizedDescription)
}

let nsdata: NSData = NSData(data: data!)

arreglo = self.retornarDatos(nsdata)
completionHandler(datos: arreglo)


})
task.resume()
}

class func retornarDatos(nsdata: NSData)-> Array<String>{

let datos = NSString(data:nsdata,encoding: NSUTF8StringEncoding)
let partes = datos?.componentsSeparatedByString(",")
var arreglo : [String] = []
for i in partes!{
arreglo.append(i)
}

return arreglo
}

}

在 View Controller 中使用这个

 var resultadoWebService = WebService.llamarWebService{
datos in print([datos[0],datos[1],datos[2],datos[3],datos[4]])
}

我需要保存例如:

var1 = datos[0]
var2 = datos[1]

实际上在控制台中显示代码

[OK, LeoAndroid, 20, 2, 2222222222]

最佳答案

首先,使用 resultadoWebService 没有意义。所以我会像这样简化您的代码段:

WebService.llamarWebService { datos in
print([datos[0],datos[1],datos[2],datos[3],datos[4]])
}

其次,您询问了有关更新变量的问题。但实际上,更新局部变量没有意义,但也许您想更新调用对象的属性。如果是这样,请在闭包内更新它们,然后触发适合结果的任何 UI 更新(或其他任何内容):

var var1: String?
var var2: String?

func performRequestAndUpdateUI() {
WebService.llamarWebService { datos in
guard datos.count == 5 else {
print("didn't get the number of items data I expected")
return
}

guard datos[0] == "OK" else {
print("not everything was OK")
return
}

// note, you probably want to dispatch all model updates to the main queue
// to simplify synchronization. also UI updates must happen on main queue,
// too.

dispatch_async(dispatch_get_main_queue()) {
self.var1 = datos[1]
self.var2 = datos[2]
...
// do whatever UI updates you want here
}
}

// but don't try to use `datos` results here, because the above runs
// asynchronously and we don't have the result by the time we get here
// in our code.
}

现在,datos 是否总是有五个项目,以及您是否要检查 datos[0] OK 都已完成对你来说,但希望它能说明这个想法,即你正在处理一个异步方法,所以你不能立即使用闭包中传回的值,而是必须将它们的使用限制在闭包中本身。如果您要更新模型和/或 UI,请确保将其分派(dispatch)回主线程。但是您不能立即更新变量,因为 Web 服务的响应是异步的,直到稍后才会调用。


我可能会建议一个更安全(和更简单)的 retornarDatos,它删除了 ! 强制解包运算符,也许使用像这样的可选链接:

class func retornarDatos(data: NSData) -> [String]? {
return String(data: data, encoding: NSUTF8StringEncoding)?
.componentsSeparatedByString(",")
}

或者,如果您真的想在出现错误时返回一个空字符串数组,就像当前的演绎版一样,您可以这样做:

class func retornarDatos(data: NSData) -> [String] {
return String(data: data, encoding: NSUTF8StringEncoding)?
.componentsSeparatedByString(",") ?? [String]()
}

顺便说一句,我建议您熟悉上述代码/概念,但一旦您这样做了,您可能想要重新评估您的 Web 服务设计。我建议考虑使用 JSON 进行响应,因为解析过程更加稳健,并且更容易区分基本 Web 服务错误和成功返回某些内容(无论是否“正常”)的 Web 服务。

关于ios - 在swift中调用webservice后从异步调用函数返回数据并保存变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39105876/

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