0
私はWebサービスを呼び出してトークンを取得しています。私は、これをグローバル変数で安全にするためのさまざまな方法を試して、今シングルトンを試しました。私はそれを設定した直後に値を印刷するときに値を取得しますが、一度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"
}
}
dataTaskが非同期に実行されるため、print(Singleton.sharedInstance.getToken())がnil – KeranMarinov