Swift - 保存异步数据

时间:2015-07-29 21:56:07

标签: json swift parsing asynchronous return

我尝试在我的应用中保存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”而不是返回它时,它可以工作。

但是如何保存它......

有人知道如何保存我的异步检索数据,所以我可以使用它吗?

问候和感谢

1 个答案:

答案 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)
}

当然,您需要检查错误并以安全的方式解包可选数据,但我认为这是您想要的一般结构。