代码之家  ›  专栏  ›  技术社区  ›  Cate Daniel

Swift Combine设置函数的数据返回流

  •  0
  • Cate Daniel  · 技术社区  · 2 年前

    所以我使用Appwrite作为我的应用程序的后端。

    在我的存储库中,我想创建一个如下所示的函数

    func listenToAltersForUser(userId: String) -> PassthroughSubject(?) {
         subscription = appwriteClient.realtime(....) { event in 
             if (event.isForUser) {
                 sink.send(event)
             }
         }
    } 
    

    因此,我在互联网上找到的所有例子都使用带有预建扩展的传统网络呼叫将请求转换为流。不过我不会直接打网络电话。

    我有一个函数可以在更新时生成回调,我不知道如何创建一个可以监听的订阅。我不想为类创建全局传递主题,因为可能有多个,如果userId发生变化,我需要创建一个新的订阅。

    我知道在科特林我会用 callBackFlow 但我比swift更新。

    0 回复  |  直到 2 年前
        1
  •  0
  •   Scott Thompson    2 年前

    从AppWrite文档来看,您似乎正在为服务器注册实时通知,并希望将它们转录到内部消息流中。我 认为 您想要做的事情如下:

    (我将此代码键入SO中,因此可能无法编译)

    func eventsForUser(userId: String) -> PassthroughSubject<[whatever the type for "event" is], Never> {
    
         let subject = PassthroughSubject<[whatever the type for event is], Never>()
         net_subscription = appwriteClient.realtime(....) { event in 
             if (event.isForUser) {
                 subject.send(event)
             }
         }
    
         return subject
    
    } 
    

    此函数创建一个管道(传递主题),该管道将响应来自服务器的事件。通过管道的值最终是与 appwriteClient.realtime 传递给回调。

    如果其他代码想要侦听该管道:

       // Set up a pipeline for the user once
       let userEvents = eventsForUser(userId: aUserID)
    
       ... and then later every one that wants to subscribe will use...
    
       let subscription = userEvents.sink { event in
         ... do something with event
       }
    

    创建之后 PassthroughSubject 其他人可以订阅它,并倾听他们感兴趣的事情。