Swift Combine:一个出版商消耗另一个出版商,如何将两个流重新输出



我想了解一下为什么我的发布者没有通过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)
})

不过,我没有从combine Latest中获得任何活动。经过一些调试,我认为问题是videoPublisher中的所有视频帧都已发布,然后才能成功通过faceDetectionPublisher。如果我将打印语句附加到videoPublisher和faceDetectionPublisher的末尾,我可以看到前者的输出,但看不到后者的输出。我已经阅读了联合和其他技术,如多播,但还没有找到一个可行的解决方案。我喜欢任何关于如何更好地理解框架的组合专业知识或指导!

您的combineLatest在每个源至少发出一个值之前不会发出任何东西。由于detectFaces()从不发射,因此您的链正在停滞。您的detectFaces()运算符出现问题,或者可能没有人脸可检测,在这种情况下,您的逻辑关闭。

如果是后一种情况,那么在detectFaces()的结果上使用prepend来为管道设定一些默认值(可能是空数组?(

最新更新