【发布时间】:2017-07-27 13:46:40
【问题描述】:
我在我的应用程序中使用 Microsoft 的翻译 API,并使用此代码生成访问令牌:
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()
}
在此之后,我在 viewDidLoad 方法中使用我的 getAccessToken 函数,然后我尝试像这样访问我的访问令牌:
let realm = try! Realm()
let accessTokenObject = realm.objects(AccessToken.self)
let accessToken = accessTokenObject[0].value
print(accessToken)
但我得到这个错误:
由于未捕获的异常“RLMException”而终止应用程序,原因:“索引 0 超出范围(必须小于 0)”
我该如何解决这个错误?我知道我的 getAccessToken 函数不会创建访问令牌,但我不明白为什么。
【问题讨论】:
-
您尝试打印
token吗?可能是它没有进入块内。 -
您确定您的异步网络请求在您尝试检索值之前实际上已完成执行吗?另外,不要使用 Collection[0] 访问第一个元素,使用
accessToken.first并安全展开。 -
accessTokenObject[0]表示 accessTokenObject 必须在其中包含至少 1 个元素。但是,如果 accessTokenObject 不包含任何内容,您怎么看?当异步任务尚未完成但您开始从数据库查询数据时会发生这种情况。您可以使用accessTokenObject.first(这是避免错误的可选值,就像上面的@David 所说),并确保在您的令牌成功写入数据库后进行查询。 -
@ngbaanh 谢谢你的帮助。如何检查异步任务是否完成或不开始查询?
-
@thekmb 制作一个完成处理程序,以确保您的第一个任务在您开始第二个任务之前完成。查看更多:developer.apple.com/library/content/documentation/Swift/…
标签: swift realm microsoft-translator