快速合并:一个发布者消耗了另一个发布者,如何将两个流都撤回

时间:2019-11-02 03:19:45

标签: swift publisher combine combinelatest

我希望获得一些帮助,以了解为什么我的发布者没有通过CombineLatest运算符发出元素。我有一个发布者发布视频帧,另一个发布者使用这些视频帧并从这些帧中提取人脸。我现在正在尝试使用CombineLatest将原始视频帧和转换后的输出合并为一个(我正在使用一些自定义发布者来提取视频帧并转换这些帧):

let videoPublisher = VideoPublisher //Custom Publisher that outputs CVImageBuffers
.share()

let faceDetectionPublisher = videoPublisher
.detectFaces() // Custom Publisher/subscriber that takes in video frames and outputs an array of VNFaceObservations

let featurePublisher = videoPublisher.combineLatest(faceDetectionPublisher)
.sink(receiveCompletion:{_ in
                print("done")
            }, receiveValue: { (video, faces) in
                print("video", video)
                print("faces", faces)
            })

但是,我没有从CombineLatest中进行任何活动。经过一些调试后,我认为问题在于所有videoPublisher的videoFrames都已发布,然后任何视频帧都无法成功通过faceDetectionPublisher。如果将打印语句附加到videoPublisher和faceDetectionPublisher的末尾,则可以看到前者的输出,而后者则看不到输出。我已经阅读了合并和其他技术(例如多播),但是还没有找到一个可行的解决方案。我很乐意结合任何有关如何更好地了解框架的专业知识或指南!

1 个答案:

答案 0 :(得分:0)

您的CombineLatest不会发出任何东西,直到其每个来源都发出至少一个值为止。由于detectFaces()从未发射,因此您的链条停滞了。您的detectFaces()运算符出了点问题,或者也许没有面子可供您检测,在这种情况下,您的逻辑就关闭了。

如果是后一种情况,则在prepend的结果上使用detectFaces()为管道提供一些默认值(也许是空数组?)