es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo despedir a un editor tras otro?

Tengo dos editores, uno que recopila mensajes basados ​​en un estado y el segundo que es un temporizador. Quiero que se activen en orden, primero recopilar datos y luego iniciar un temporizador. ¿Cómo puedo hacer esto? Este es mi código actual:

let messagesPublisher = OnboardingStateLogic.publisher(
  forState: state,
  nextState: nextState
)

messagesPublisher
  .sink { completion in 
    print("completado")
  } receiveValue: { [weak self] messages in
    messages.forEach { message in
      self?.queue.enqueue(message)
    }
  }

timer = Timer
  .publish(every: 2, on: .main, in: .default)
  .autoconnect()
  .sink { _ in
    self.dequeueMessages()
  }
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para disparar los editores en el orden deseado, una posible solución es utilizar el operador flatMap de Combine. Este operador nos permite combinar múltiples editores y transformar la salida utilizando un closure que devuelve otro editor.

    En el caso del código proporcionado, podemos combinar el messagesPublisher y el editor Timer utilizando flatMap. Aquí tienes un ejemplo de implementación:

    let messagesPublisher = OnboardingStateLogic.publisher(
      forState: state,
      nextState: nextState
    )
    
    messagesPublisher
      .flatMap { messages in
        Timer.publish(every: 2, on: .main, in: .default)
          .autoconnect()
          .map { _ in messages }
      }
      .sink { completion in
        print("completed")
      } receiveValue: { [weak self] messages in
        messages.forEach { message in
          self?.queue.enqueue(message)
        }
      }
    

    En esta implementación, utilizamos flatMap para mapear la salida de messagesPublisher a un nuevo editor que combina el editor de temporizador y los mensajes. El operador map se utiliza para transformar la salida del temporizador en el array original de mensajes. Por último, nos suscribimos al editor combinado utilizando sink como antes.

    Con esta implementación, los mensajes se recopilarán primero, luego el temporizador comenzará a dispararse cada 2 segundos y, para cada evento del temporizador, se llamará al método dequeueMessages para procesar los mensajes encolados.

Comments are closed.