我希望获得一些帮助,以了解为什么我的发布者没有通过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的末尾,则可以看到前者的输出,而后者则看不到输出。我已经阅读了合并和其他技术(例如多播),但是还没有找到一个可行的解决方案。我很乐意结合任何有关如何更好地了解框架的专业知识或指南!
答案 0 :(得分:0)
您的CombineLatest不会发出任何东西,直到其每个来源都发出至少一个值为止。由于detectFaces()
从未发射,因此您的链条停滞了。您的detectFaces()
运算符出了点问题,或者也许没有面子可供您检测,在这种情况下,您的逻辑就关闭了。
如果是后一种情况,则在prepend
的结果上使用detectFaces()
为管道提供一些默认值(也许是空数组?)