我尝试从应用程序中的 API 保存数据。
但不知何故它失败了:
func getApiData() -> NSArray {
let ApiManager = RestApiManager(apiUrl:"http://localhost/api/", apiUsername:"user", apiPassword:"password", apiRequestedResource:"resource")
ApiManager.collectDataFromApi() { responseObject, error in
return responseObject! // Asynchronous data!! :/
}
}
我的经理:
func collectDataFromApi(completionHandler: (responseObject: NSDictionary?, error: NSError?) -> ()) {
prepareHttpRequest(completionHandler)
}
func prepareHttpRequest(completionHandler: (responseObject: NSDictionary?, error: NSError?) -> ()) {
Alamofire.request(.GET, "\(self.apiUrl + self.apiRequestedResource)")
.authenticate(user: self.apiUsername, password: self.apiPassword)
.responseJSON { request, response, responseObject, error in
completionHandler(responseObject: responseObject as? NSDictionary, error: error)
}
}
检索数据效果很好!
当我打印“responseObject”而不是返回它时,它起作用了。
但是如何保存它...
有人知道我如何保存异步检索的数据,以便我可以使用它吗?
问候和感谢
最佳答案
您的getApiData
函数无法返回API数据,因为当函数返回时,数据尚未准备好。这是异步编程的核心概念。您的函数启动网络操作,然后返回,以便当您的网络操作在不同的线程上工作时,程序可以继续执行。
您可以考虑传递一个完成处理程序,而不是从 getApiData
函数返回值,就像示例中的其他异步函数所做的那样。它看起来像这样:
func getApiData(completion: (responseObject: NSDictionary?, error: NSError?) -> ()) {
let ApiManager = RestApiManager(apiUrl:"http://localhost/api/", apiUsername:"user", apiPassword:"password", apiRequestedResource:"resource")
ApiManager.collectDataFromApi() { responseObject, error in
completion(responseObject, error)
}
}
无论您想在数据准备好后对数据执行什么操作,都会在完成处理程序中进行。而不是像这样使用它(就像我认为你可能会尝试这样做):
let data = getApiData()
processData(data)
updateUserInterfaceWithData(data)
你可以像这样使用它:
getApiData() { responseObject, error in
let data = responseObject!
processData(data)
updateUserInterfaceWithData(data)
}
当然,您希望检查错误并以安全的方式解开可选数据,但我认为这是您想要的一般结构。
关于json - Swift - 保存异步数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31711893/