首页 > 解决方案 > 在 Swift 中执行同步 API 调用

问题描述

我需要在 Swift 中实现对 rest API 的同步调用(GET 和 POST)。我知道以前有人问过这个问题,但是我发现的所有解决方案都集中在使用其中一种异步方法(如 URLSession)和构建某种包装器(例如使用 Semaphore),等待进程完成然后继续与程序。这是不必要的复杂,所以我想知道是否没有像许多其他编程语言那样更简单的解决方案。例如,在 Python 中,您只需一行代码即可实现相同的目标(好吧,您必须为此包含 requests 库)

response = requests.get("https://jsonplaceholder.typicode.com/posts")

Swift 有这样的可能性(或框架)吗?您在 2021 年的首选方法是什么?

编辑:也许我之前应该提到这一点:用例是一个非常具体的企业用例的命令行应用程序。不涉及用户界面。但是正如许多人在答案中已经绝对正确地指出的那样:通常,这绝对不是要走的路。

标签: swift

解决方案


let response = try Data(contentsOf: url)

只要这是一个命令行应用程序,就可以了(通常甚至还不错)。如果这是一个 iOS 应用程序,如果返回时间过长,这可能会使程序崩溃,所以不要这样做。使用异步方法。它们并不太复杂;他们解决了所需的问题。(这可以在后台队列上完成,但通常不应该这样做。它会导致线程爆炸。)

如果您使用带有 async/await 的 Swift 5.5,请使用URLSession.bytes(for:)

let response = await try urlSession.bytes(for: url)

这适用于任何异步代码。(它不是“同步调用”,而是以这种方式编写的。)

没有解决方案可以在主线程上的 iOS 上以同步代码从网络获取数据。这是设计使然。你绝不能阻塞主线程。没有库或框架可以改变这一点。如果您在驱动 UI 的事件循环上使用 Python,在 Python 中甚至会是这样。这不是语言问题。事实上,主运行循环需要继续处理,否则 UI 将挂起。


推荐阅读