我正在try 使用网络请求实现简单计数器的更新,但希望获得实时更新.我只能想到用WebSocket美元.

我可以使用Structured ConcurrencyCombine获得类似的交互吗? 也许我应该只使用TimelineView,并且每秒执行一个请求?

推荐答案

Swift并发与遗留模式的问题与你使用WebSocket还是HTTPS无关.你可以使用Swift的并发性与任何一种方法.

  1. 如果你的后端使用的是web sockets,那么客户端可以很容易地使用Swift并发.因此,如果你的后端已经实现了实时通信,你可以使用URLSession WebSocket(在WWDC 2019视频Advances in Networking, Part 1中讨论).例如,你可以创建socket:

    let socket = URLSession.shared.webSocketTask(with: url)
    socket.resume()
    

    然后,您可以使用SWIFT并发性达到send:

    try await socket.send(…)
    

    并设置为receive:

    let message = try await socket.receive()
    
  2. FWIW,每秒(或其他)使用HTTPS GET轮询最好被视为反模式.

  3. 如果您希望在不使用套接字的情况下实现(接近)实时通信,则可以在客户端收到消息时让服务器发布APNS推送通知.关于此APNS有效负载的性质,它根据消息的性质而有所不同:

    • 如果有效负载是短文本消息,则可以在推送通知的有效负载中包含要发送到客户端的消息的内容.这种模式的优点是,客户端应用程序不需要运行,用户就可以在其设备上看到消息alert .因此,推送有效负载包括alert 消息(如果用户当前没有使用您的应用程序)和数据有效负载(如果您不希望应用程序显示系统alert ,则应用程序可以对其进行解析和处理).或,

    • 如果发送的有效负载超出了UserNotificationsalert 中可以包括的范围(例如,大型assets资源 或流URL),则推送有效负载会带有一个alert ,即"您有一条消息",但也包括一些标识符,并让客户端在接收到推送通知时对内容执行HTTPS GET请求(这是我对较大的有效负载,如图像等assets资源 所做的操作).

    无论哪种方式,您的应用都可以拦截这些推送通知,并且由您决定是否显示系统alert 或您的应用是否会无缝处理它.

在我的实时消息传递解决方案中,我使用了一种混合方法,同时使用套接字(用于应用程序内的实时交互)和推送通知(在应用程序未运行时提醒用户新内容).但是,如果您不想陷入可伸缩Web套接字的后端基础设施,推送范例仍然可以实现(接近)实时消息传递,而不会陷入严重低效的轮询模式.

但同样,您为实时报文传送 Select 的后端架构在很大程度上与您是否使用SWIFT并发(或组合)无关.您可以使用SWIFT并发性,也可以与几乎任何更广泛的报文传送范例相结合.

Swift相关问答推荐

如何让CTFontCreateUIFontForLanguage与汉字和表情包协同工作?

如何在visionOS上删除PhotosPicker背景 colored颜色 ?

带有文本输入自动大小写修饰符的SwiftUI Textfield问题

将变量设置为 @Published 会 destruct 代码而不会出现任何错误

SwiftUI,如何更改具有多个按钮和一个布尔条件的一个按钮标签

SwiftUI路径平滑连接两条线

SwiftUI如何能够在Text中使用字符串字面量来创建LocalizedStringKey?

如何打印出此 struct 中的数据?

Pod lib lint 命令找不到 watchos 模拟器

Swift并发:为什么不在其他后台线程上执行任务

如何为 Swift UI 视图定义 struct ?

SwiftUI - Select 器没有 Select 值

判断 Swift 程序是否正在输出到终端

Swift - 如何更新多目录中的对象

EXC_BREAKPOINT 崩溃的原因范围

Swiftwhere数组扩展

UICollectionView 自定义单元格在 Swift 中填充宽度

UIButton 标题左对齐问题 (iOS/Swift)

Void 函数中意外的非 Void 返回值 (Swift 2.0)

如何在 SwiftUI 中的一个视图上显示两个alert ?