2017-07-27 6 views
0

Ich benutze Microsofts Übersetzer API in meiner app und ich verwende diesen Code Zugriffstoken zu generieren:Swift Realm ‚RLMException‘ Grund: ‚Index 0 außerhalb der Grenzen ist (muss kleiner als 0)

func getAccessToken(){ 

    let key = "---" 
    let requestUrl = URL(string: "https://api.cognitive.microsoft.com/sts/v1.0/issueToken") 
    var request = URLRequest(url: requestUrl!) 
    request.httpMethod = "POST" 
    request.addValue(key, forHTTPHeaderField: "Ocp-Apim-Subscription-Key") 

    let task = urlSession.dataTask(with: request) { (data, response, error) in 
     guard let data = data, error == nil else{ 
      return 
     } 
     let token = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) 

     let realm = try! Realm() 

     let accessToken = AccessToken() 

     accessToken.value = token! 

     try! realm.write { 
      realm.add(accessToken) 
     } 
    } 


    task.resume() 
} 

danach benutze ich meine getAccessToken Funktion in viewDidLoad Methode und dann versuche ich, wie dies meine Zugriffstoken zuzugreifen:

let realm = try! Realm() 
let accessTokenObject = realm.objects(AccessToken.self) 

let accessToken = accessTokenObject[0].value 

print(accessToken) 

Aber ich bekomme diese Fehlermeldung:

Terminating app due to uncaught exception 'RLMException', reason: 'Index 0 is out of bounds (must be less than 0)'

Wie kann ich diesen Fehler beheben? Ich verstehe, dass meine Funktion getAccessToken das Zugriffstoken nicht erstellt, aber ich verstehe nicht warum.

+0

Versuchen Sie 'token' Druck? vielleicht geht es nicht in den Block. –

+0

Sind Sie sicher, dass Ihre asynchrone Netzwerkanforderung die Ausführung tatsächlich beendet, bevor Sie versucht haben, den Wert abzurufen? Verwenden Sie auch nicht Collection [0], um auf das erste Element zuzugreifen, verwenden Sie "accessToken.first" mit sicherem Auspacken. –

+0

'accessTokenObject [0]' bedeutet, dass das ** accessTokenObject ** MUSS mindestens 1 Element enthält. Aber wie denkst du, wenn das ** accessTokenObject ** nichts enthält? Dies passiert, wenn die Async-Aufgabe ** noch nicht beendet ist **, aber Sie beginnen, die Daten aus der Datenbank abzufragen. Sie können 'accessTokenObject.first' verwenden (was ein optionaler Wert ist, um den Fehler zu vermeiden, wie zum Beispiel @David oben), und sicherstellen, dass Sie abfragen, nachdem Ihr Token erfolgreich in die Datenbank geschrieben wurde. – ngbaanh

Antwort

0

Dieser Code SWIFT-Code arbeitet ein Token zu bekommen:

var zu = String()

// Methode ein Azure-Token zu erhalten. func getAccessToken() -> String {

print("********get azure token selected********") 

let azureKey = "xxxxxxxxxxxxxxxxxxxxxxx" 
let postString = azureKey 
let request = NSMutableURLRequest(url: URL(string: "https://api.cognitive.microsoft.com/sts/v1.0/issueToken")!) 

request.httpMethod = "POST" 
request.addValue(postString, forHTTPHeaderField:"Ocp-Apim-Subscription-Key") 

let task = URLSession.shared.dataTask(with: request as URLRequest) { 
    data, response, error in 

    print("This is the data ********->", data as Any) 
    print("This is the response ********->", response as Any) 
    print("This is the error ********->", error as Any) 

    if error != nil { 
     print("error=\(String(describing: error))") 

     return 
    } 

    let responseString = String(data: data!, encoding: .utf8) 
    print("responseString = \(String(describing: responseString))") 
    azureToken = responseString! 

} 

task.resume() 

return azureToken 

}

Verwandte Themen