Función de transformación que combina editores y consumidores en una función asíncrona.
Tengo la siguiente función loadData
y quiero usarla dentro de refreshable
de una lista SwiftUI. Para esto, necesito convertirla en una función async
:
func loadData() async {
// Publishers
let followersPublisher = await modelLoader.loadAllFollowers(withId: id)
let followingPublisher = await modelLoader.loadAllFollowing(withId: id)
let friendshipsPublisher = await Publishers.Zip(followersPublisher, followingPublisher)
.share()
.eraseToAnyPublisher()
// Sinks
getFollowers(from: followersPublisher)
getFollowerChange(
from: followersPublisher,
cachedFollowers: followers
)
getFollowing(from: followingPublisher)
getNotFollowingUserBack(from: friendshipsPublisher)
getUserNotFollowing(from: friendshipsPublisher)
await followersPublisher
.connect()
.store(in: &cancellables)
await followingPublisher
.connect()
.store(in: &cancellables)
}
Dentro de esta función, todas las funciones separadas utilizan los sink
de Publisher
. Por ejemplo:
private func getFollowing(from publisher: Publishers.MakeConnectable<><><user>, Never>>) {
publisher
.sink(
receiveCompletion: { _ in },
receiveValue: { [weak self] following in
self?.following = following
}
)
.store(in: &cancellables)
}
¿Cómo puedo convertirlo en una función async
para poder usar await
con él?
davy.ai
Para convertir la función
loadData()
en una funciónasync
, sigue estos pasos:async
antes del tipo de retorno:get
para devolver una “Promise” que se resuelve con el valor esperado:await
para llamar a cada una de las funcionesget
y espera a que se resuelvan antes de continuar:Al modificar las funciones
get
para devolver “Promises” y utilizarawait
para resolverlas dentro de la funciónloadData()
, podemos convertirla en una funciónasync
que se puede utilizar conrefreshable
en una lista de SwiftUI.