我尝试在我的应用中保存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”而不是返回它时,它可以工作。
但是如何保存它......
有人知道如何保存我的异步检索数据,所以我可以使用它吗?
问候和感谢
答案 0 :(得分:1)
您的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)
}
当然,您需要检查错误并以安全的方式解包可选数据,但我认为这是您想要的一般结构。