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.
Versuchen Sie 'token' Druck? vielleicht geht es nicht in den Block. –
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. –
'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