我正在try 使用网络请求实现简单计数器的更新,但希望获得实时更新.我只能想到用WebSocket
美元.
我可以使用Structured Concurrency
或Combine
获得类似的交互吗?
也许我应该只使用TimelineView,并且每秒执行一个请求?
我正在try 使用网络请求实现简单计数器的更新,但希望获得实时更新.我只能想到用WebSocket
美元.
我可以使用Structured Concurrency
或Combine
获得类似的交互吗?
也许我应该只使用TimelineView,并且每秒执行一个请求?
Swift并发与遗留模式的问题与你使用WebSocket还是HTTPS无关.你可以使用Swift的并发性与任何一种方法.
如果你的后端使用的是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()
FWIW,每秒(或其他)使用HTTPS GET
轮询最好被视为反模式.
如果您希望在不使用套接字的情况下实现(接近)实时通信,则可以在客户端收到消息时让服务器发布APNS推送通知.关于此APNS有效负载的性质,它根据消息的性质而有所不同:
如果有效负载是短文本消息,则可以在推送通知的有效负载中包含要发送到客户端的消息的内容.这种模式的优点是,客户端应用程序不需要运行,用户就可以在其设备上看到消息alert .因此,推送有效负载包括alert 消息(如果用户当前没有使用您的应用程序)和数据有效负载(如果您不希望应用程序显示系统alert ,则应用程序可以对其进行解析和处理).或,
如果发送的有效负载超出了UserNotifications
alert 中可以包括的范围(例如,大型assets资源 或流URL),则推送有效负载会带有一个alert ,即"您有一条消息",但也包括一些标识符,并让客户端在接收到推送通知时对内容执行HTTPS GET
请求(这是我对较大的有效负载,如图像等assets资源 所做的操作).
无论哪种方式,您的应用都可以拦截这些推送通知,并且由您决定是否显示系统alert 或您的应用是否会无缝处理它.
在我的实时消息传递解决方案中,我使用了一种混合方法,同时使用套接字(用于应用程序内的实时交互)和推送通知(在应用程序未运行时提醒用户新内容).但是,如果您不想陷入可伸缩Web套接字的后端基础设施,推送范例仍然可以实现(接近)实时消息传递,而不会陷入严重低效的轮询模式.
但同样,您为实时报文传送 Select 的后端架构在很大程度上与您是否使用SWIFT并发(或组合)无关.您可以使用SWIFT并发性,也可以与几乎任何更广泛的报文传送范例相结合.