gpt4 book ai didi

swift - 失去单例的值(value)

转载 作者:行者123 更新时间:2023-11-30 12:12:48 24 4
gpt4 key购买 nike

我正在调用网络服务并取回 token 。我尝试了不同的方法来在全局变量中保护它,现在尝试了单例。当我设置值后立即打印该值时,我会得到该值,但是一旦我退出 Web 服务 URLSession.shared.dataTask 调用并恢复单例中的值就消失了。下面是我的代码,请注意我现在只做 swift 一周:)

request.httpBody = postString.data(using: .utf8) 

let task = URLSession.shared.dataTask(with: request) { data ,response, error in
guard let data = data, error == nil else { // check for fundamental networking error
print("error=(error)")
return
}

if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = (response)")
}

// Get rid of ekstra escape chars
let responseString = String(data: data, encoding: .utf8)
let newString = responseString?.replacingOccurrences(of: "\\", with: "")
let newString2 = newString?.replacingOccurrences(of: "\"{", with: "{")
let newString3 = newString2?.replacingOccurrences(of: "}\"", with: "}")
let newdata = newString3?.data(using: .utf8)!

do {
let json = try JSONSerialization.jsonObject(with: newdata!, options: .allowFragments) as! [String:Any]
Singleton.sharedInstance.setToken(Token: (json["SessionToken"] as? String)! )
print(Singleton.sharedInstance.getToken()) // VALUE CORRECT

} catch let error as NSError {
print(error)
}

print(Singleton.sharedInstance.getToken()) // STILL GET THE CORRECT VALUE
}
task.resume()

print(Singleton.sharedInstance.getToken()) // THE VALUE IS NOW NIL


class Singleton {
static let sharedInstance = Singleton()

var rToken:String?

func setToken( Token:String){
let lToken = Token
rToken = lToken
}

func getToken() -> String {

if self.rToken != nil {
return self.rToken!
}

return "0"
}

}

最佳答案

正如 KeranMarinov 指出的那样,该操作是异步完成的,因此您将陷入竞争状态。基本上,您的请求在后台线程上完成所需的时间比主线程进入下一行并检查值所需的时间更长。

您可以做的是在主线程上分派(dispatch)您的请求,然后检查值:

dispatch_async(dispatch_get_main_queue(), {
myRequest()
})
print(Singleton.sharedInstance.getToken())

另外,让我们整理一下字符串的清理工作:

let sanitizedData = String(data: data, encoding: .utf8)!
.replacingOccurrences(of: "\\", with: "")
.replacingOccurrences(of: "\"{", with: "{")
.replacingOccurrences(of: "}\"", with: "}")
.data(using: .utf8)!

最后,您还应该查看 completion handlers ,这是处理异步行为影响的好方法。

关于swift - 失去单例的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45846926/

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