【问题标题】:Swift Realm 'RLMException', reason: 'Index 0 is out of bounds (must be less than 0)Swift Realm 'RLMException',原因:'索引 0 超出范围(必须小于 0)
【发布时间】: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


【解决方案1】:

此代码正在运行 swift 代码以获取令牌:

var azureToken = String()

//Method to get an Azure token.

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2015-05-26
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多