В Combine, как запустить серию фьючерсов в последовательности? - PullRequest
1 голос
/ 08 марта 2020

Есть ли оператор Combine, который будет последовательно запускать серию фьючерсов, выполняя каждый из них до завершения следующего?

Я могу сделать это очень беспорядочно:

f1
.flatMap { _ in 
  f2
}.flatMap { _ in 
  f3
}.flatMap { _ in 
  // ... 
}

но я бы предпочел что-то вроде:

sequence(f1, f2, f3, ...)

В некоторых платформах это будет выглядеть так:

f1.then { f2 }.then { f3 }

1 Ответ

0 голосов
/ 09 марта 2020

Ключ заключается в том, чтобы обернуть будущее в отложенное, чтобы оно не запустилось до тех пор, пока не пришло время:

let f1 = Deferred { Future<Int, Error> { result in

    }
}
let f2 = Deferred { Future<Int, Error> { result in

    }
}
let f3 = Deferred { Future<Int, Error> { result in

    }
}
let jobs = f1
    .append(f2)
    .append(f3)

cancellable = jobs.sink(receiveCompletion: { (completion) in
    print("all three jobs done or one errored.")
}, receiveValue: { value in
    print("value of job:", value)
})

В ответ на дополнительные вопросы в комментариях:

Вы не можете полагаться на Отложенный для отсрочки выполнения закрытия до тех пор, пока не войдет подписчик, потому что Отложенный является структурой и приведет к созданию нового Будущего при каждом новом подписчике.

Это точно точка отсрочки. Создавать новое будущее каждый раз, когда появляется новый подписчик, а не раньше. Другой вариант - создать фьючерс внутри добавления.

let jobs = Future<Int, Error> { result in }
    .append(Future<Int, Error> { result in })
    .append(Future<Int, Error> { result in })

Но тогда все три фьючерса выполнят свой код одновременно. Я предполагаю, что вы этого не хотите.

...