json - Swift - 保存异步数据

标签 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”而不是返回它时,它起作用了。

但是如何保存它...

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

问候和感谢

最佳答案

您的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/

相关文章:

ios - 自定义 URL 方案

java - 在 Java 中将字符串解析为比较器类型

c++ - 解析数据,scanf?

javascript - 如何结合ajax和CORS向另一个域发送json请求

java - 读取包含许多 json 对象的 Json 文件

json - Swift 控制台输出到文本标签

iOS swift : UIPageViewController - Turning page programmatically

ios - 为什么我的 MKPointAnnotation 不可拖动,我该如何更改它?

javascript - D3JS折线图倒置问题

parsing - 在解析表达式的评估中将 [IO String] 转换为 IO String