2017-08-23 4 views
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" 
} 

}

+0

dataTaskが非同期に実行されるため、print(Singleton.sharedInstance.getToken())がnil – KeranMarinov

答えて

0

KeranMarinovあなたは競合状態になっているので、操作は、非同期的に完了する指摘するように。基本的には、メインスレッドが次の行にステップして値をチェックするのに必要な時間より、バックグラウンドスレッドで完了するまでに時間がかかります。あなたは何ができるか

は、メインスレッドでリクエストを派遣して、値をチェックします:

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も参照する必要があります。これは、非同期動作の影響を処理する良い方法です。

関連する問題