Closed moh-abk closed 3 years ago
Hey,
LazyList
conforms to Sequence
and RandomAccessCollection
, so you can do just Array(list)
You may want to refactor your code and get rid of LazyList
in the middle. The main reason for its use in the sample project was to allow for querying and converting CoreData objects to the data model used in the UI lazily for performance reasons.
Thanks for quick response @nalexn I don't understand your last comment;
func cards() -> AnyPublisher<LazyList<Card>, Error>
. PersistenceStore fetch
always returns a LazyList
For your first comment, I updated the code to below;
func refreshCards(id: String) -> AnyPublisher<Void, Error> {
var cards: [Card] = []
return gateway
.listCards(customerID: id)
.map {
response in
response.cards.forEach {
cards.append(Card(protoObject: $0)!)
}
return cards // Cannot convert return expression of type '[Card]' to return type 'LazyList<Card>'
}
.catch {
err in
// must return a Publisher
repository.cards()
}
.flatMap {
[repository] in
repository.store(cards: Array($0))
}
.eraseToAnyPublisher()
}
But above I now get - Cannot convert return expression of type '[Card]' to return type 'LazyList<Card>'
You can convert LazyList to Array earlier so the returned container type matches in every step in the chain:
func refreshCards(id: String) -> AnyPublisher<Void, Error> {
return gateway
.listCards(customerID: id)
.map {
response in
return response.cards.map {
Card(protoObject: $0)!
}
}
.catch {
err in
// must return a Publisher
Array(repository.cards())
}
.flatMap {
[repository] in
repository.store(cards: $0)
}
.eraseToAnyPublisher()
}
ended up getting rid of LazyList
completely as your code snippet showed other errors and also kept tripping into - https://github.com/nalexn/clean-architecture-swiftui/blob/master/CountriesSwiftUI/Utilities/LazyList.swift#L124;
final code;
return gateway
.listCards(customerID: id)
.map { response in
return response.cards.map {
Card(protoObject: $0)!
}
}
.catch { err in
// must return a Publisher
repository.cards()
}
.flatMap { [repository] in
repository.store(cards: Array($0))
}
.eraseToAnyPublisher()
thanks for the pointers!
Awesome template for clean architecture!
I've the below combine pipeline which is the opposite of way you're handling data in this template; In most real world scenarios;
repository.store(cards: )
accepts an array of cards -[Card]
- how can I unpackLazyList
and turn it into an array?