作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在调用网络服务并取回 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!