Ключ заключается в том, чтобы обернуть будущее в отложенное, чтобы оно не запустилось до тех пор, пока не пришло время:
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 })
Но тогда все три фьючерса выполнят свой код одновременно. Я предполагаю, что вы этого не хотите.