Почему функции вызываются несколько раз в плоских картах?

#combine

#объединить

Вопрос:

У меня есть следующий код:

 func myFunction() -> AnyPublisher<MyObject, MyError> {
   return self.globalPublisher
      // FlatMap 1
      .flatMap { value1 -> AnyPublisher<Object1, Error1 > in 
         return self.function1(value1)
      }
      // FlatMap 2
      .flatMap { value2 -> AnyPublisher<Object2, Error2 > in 
         return self.function1(value2)
      }
      // FlatMap3
      .flatMap { value3 -> AnyPublisher<Object3, Error3 > in 
         return self.function1(value3)
      }
      .eraseToAnyPublisher()
   })
}
  

myFunction имеет только одного подписчика (проверено с помощью debug). globalPublisher может запускаться несколько раз и в любое время. Это запускает всю flatMap логику.

Когда функция globalPublisher запускается в первый раз, все в порядке: каждая функция в каждом flatMap блоке вызывается один раз. Но во второй раз происходит что-то странное. Запускается globalPublisher только один раз. Функция в FlatMap 1 также запускается только один раз и возвращает только одно значение (проверяется с помощью debug). Но функция в FlatMap 2 внезапно запускается дважды и возвращает два значения. Затем функция in FlatMap 3 запускается 6 раз.

То же самое происходит в третий и последующие разы: globalPublisher и функция в FlatMap 1 запускается один раз, а function1() возвращает только одно значение. Остальные запускаются несколько раз, и количество триггеров становится все больше и больше.

Может кто-нибудь сказать мне, что может быть причиной такого странного поведения плоских карт? Я уже несколько раз просматривал свой код и отлаживал его. На самом деле, все должно работать. Я полагаю, возможно, что глобальный издатель каким-то образом хранит «подписки» плоских карт? Но я не думаю, что это работает таким образом. У вас есть какие-то идеи?

Я подозреваю, что проблема заключается в сочетании глобального издателя и всех плоских карт.

Заранее спасибо.

Комментарии:

1. Вы пытаетесь использовать? flatMap(maxPublishers: .max(1))

2. @BilalReffas Привет, Билал. Нет. Я не пробовал это, потому что хочу знать возможную причину, почему это происходит. С вашим предложением я просто решаю проблему. Но это не исчезает. Я подозреваю, что я неправильно использую плоские карты. Я подозреваю, что проблема заключается в сочетании глобального издателя и всех плоских карт.

3. Здесь трудно помочь, поскольку вы не показываете нам ни сайт подписки, ни сайт вызова, ни что globalPublisher есть, ни что function1 есть.

Ответ №1:

Я вижу здесь два варианта.

Либо

Итак flatmap maxPublishers , здесь есть проверка параметров. По умолчанию для параметра установлено значение
.unlimited который контролирует, сколько издателей может принять метод.

Вот почему ваши плоские карты публикуют эти значения неограниченно. Вам нужно изменить параметр и установить для него что-то вроде flatMap(maxPublishers: .max(1))

Или
Вы можете использовать switchToLatest, который всегда будет использовать самого последнего предоставленного издателя.

Комментарии:

1. или, возможно, dennis_ka должен использовать switchToLatest , а не flatMap .

2. @robmayoff Ваше решение помогло мне. Спасибо. Теперь все блоки и функции в них вызываются ровно один раз. Я не знаю, решил ли я основную проблему, но она работает правильно. @BilalReffas С flatMap(maxPublishers: .max(1)) этим не сработало. Все блоки запускаются только один раз / в первый раз (если я меняю max на 2 , затем дважды и т.д.). После этого больше нет.