You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中多AsyncStream监听失败:如何同时监听Supabase双流

解决Supabase Presence和Postgres Change Stream同时监听的问题

你的问题核心在于**for await循环是阻塞式的**——第一个循环会一直持续监听presenceStream,程序永远不会执行到第二个changeStream的循环,反之亦然。要同时监听两个流,必须将它们分别包装在Task中,让两个异步任务并发运行。

修改后的代码

func configureChannelSubscription() async throws {
    let channel = supabaseClient.channel("general")
    let presenceStream = channel.presenceChange()
    
    let changeStream = channel.postgresChange(
        AnyAction.self,
        schema: "public",
        table: "chats"
    )
    
    let userStatus = UserStatus(username: "johndoe", online: true)
    
    await channel.subscribe()
    try await channel.track(userStatus)
    
    // 用Task包装presence流的监听任务
    Task {
        for await presence in presenceStream {
            print("presence")
            print(presence.joins)
            print(presence.leaves)
        }
    }
    
    // 用Task包装postgres change流的监听任务
    Task {
        for await change in changeStream {
            switch change {
                case .delete(let action): print("Deleted: \(action.oldRecord)")
                case .insert(let action):
                    await handleInsertChat(action.record)
                case .select(let action): print("Selected: \(action.record)")
                case .update(let action): print("Updated: \(action.record)")
            }
        }
    }
}

关键说明

  • Task会创建独立的异步任务,两个任务可以同时运行,互不阻塞。
  • 如果需要管理任务生命周期(比如页面销毁时停止监听),可以保存Task的引用,调用task.cancel()终止任务。
  • handleInsertChat作为异步方法,在Task中使用await完全合法,不会影响另一个任务的执行。

内容的提问来源于stack exchange,提问作者john doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:22:03