Быстрое объединение: один издатель потребляет другой, как вернуть оба потока обратно - PullRequest
1 голос
/ 02 ноября 2019

Мне нужна помощь в понимании того, почему мои издатели не отправляют элементы через оператор combLatest. У меня есть издатель, который излучает видеокадры, и другой издатель, который использует эти видеокадры и извлекает лица из этих кадров. Сейчас я пытаюсь объединить исходные видеокадры и преобразованный вывод в один с помощью combLatest (я использую несколько пользовательских издателей для извлечения видеокадров и преобразования кадров):

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)
            })

Я не получаюлюбая деятельность вне комбинатаПоследний, однако. После некоторой отладки, я думаю, проблема в том, что все видеокадры из videoPublisher публикуются до того, как они могут успешно пройти через faceDetectionPublisher. Если я присоединяю операторы печати к концу videoPublisher и faceDetectionPublisher, я вижу выходные данные из первого, но ни одного из последнего. Я читал о комбинате и других методах, таких как многоадресная рассылка, но не нашел рабочего решения. Мне бы хотелось, чтобы любой опыт или руководство по объединению помогло лучше понять структуру!

1 Ответ

0 голосов
/ 02 ноября 2019

Ваш комбайнЛатест не будет излучать ничего, пока каждый из его источников не выдаст хотя бы одно значение. Поскольку detectFaces() никогда не излучает, ваша цепь останавливается. Что-то не так в вашем операторе detectFaces() или, возможно, нет лиц, которые можно обнаружить, в этом случае ваша логика отключена.

Если в последнем случае, используйте prepend в результате detectFaces() длязаполнить конвейер некоторым значением по умолчанию (может быть, пустым массивом?)

...