【问题标题】:Swift - Save asynchronous dataSwift - 保存异步数据
【发布时间】:2015-07-29 21:56:06
【问题描述】:

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

但是怎么保存呢……

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

问候和感谢

【问题讨论】:

  • 没有保存异步检索数据的选项吗? ...

标签: json swift parsing asynchronous return


【解决方案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)
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2013-05-29
    • 1970-01-01
    • 2019-04-03
    • 2018-06-29
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多