swift - 在 Swift 中执行同步 API 调用
问题描述
我需要在 Swift 中实现对 rest API 的同步调用(GET 和 POST)。我知道以前有人问过这个问题,但是我发现的所有解决方案都集中在使用其中一种异步方法(如 URLSession)和构建某种包装器(例如使用 Semaphore),等待进程完成然后继续与程序。这是不必要的复杂,所以我想知道是否没有像许多其他编程语言那样更简单的解决方案。例如,在 Python 中,您只需一行代码即可实现相同的目标(好吧,您必须为此包含 requests 库):
response = requests.get("https://jsonplaceholder.typicode.com/posts")
Swift 有这样的可能性(或框架)吗?您在 2021 年的首选方法是什么?
编辑:也许我之前应该提到这一点:用例是一个非常具体的企业用例的命令行应用程序。不涉及用户界面。但是正如许多人在答案中已经绝对正确地指出的那样:通常,这绝对不是要走的路。
解决方案
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 将挂起。
推荐阅读
- javascript - jQuery td:包含
- c++ - SFML - 精灵没有正确居中
- assembly - 汇编 x64 将用户输入字符串转换为整数以进行比较
- php - 如何使用 php codeigniter 修剪 url
- angular - valueChanges 尝试抛出对象为空的错误(反应形式)
- php - 通过门户网站上传大文件
- javascript - 如何计算模型中的嵌套元素?
- java - 用java创建一个新变量
- python - 编写一个程序,将随机创建的 100 个随机整数写入文件。Python 文件输入/输出
- mysql - 如何在 SQL/SQLalchemy 中对多条记录使用 join 和 order_by?