【发布时间】:2020-08-18 14:01:58
【问题描述】:
在下面的示例中,我发出一个网络请求来加载不同类型的电影,然后使用它来加载所有电影。接收器只返回电影结果。我怎样才能同时接收流派和电影?
struct Genre: Codable, Identifiable{
let id: Int
let name: String
var movies: [Movie]?
}
struct Movie: Codable, Hashable, Identifiable {
let title: String
let id: Int
let posterPath: String?
let backdropPath : String?
var tagline: String?
}
loadGenres() is AnyPublisher<[Genre], Error>
fetchMoviesIn() is AnyPublisher<[Movie], Error>
class GenresViewModel: ObservableObject{
@Published var genres = [Genre]()
@Published var movies = [Movie]()
var requests = Set<AnyCancellable>()
init(){
NetworkManager.shared.loadGenres()
.flatMap{ genres in
genres.publisher.flatMap{ genre in
NetworkManager.shared.fetchMoviesIn(genre)
}
}
.collect()
.retry(1)
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { completion in
switch completion{
case .finished:
print("Finished loading all movies in every genre")
case .failure(let error):
print("Error: \(error)")
}
}, receiveValue: { [self] values in
let allMovies = values.joined()
self.movies = allMovies.map{$0}
})
.store(in: &self.requests)
}
}
【问题讨论】:
-
loadGenres()和fetchMoviesIn方法的返回类型是什么? -
AnyPublisher 和 AnyPublisher
-
@RichardWitherspoon,你想如何收集最终结果?例如:
[(Genre, [Movie])]是一个类型到电影映射的数组,或者只是独立的数组:([Genre], [Movie]) -
@NewDev 更喜欢第一个,但如果你可以为两者提供示例,那么我理解这将是惊人的差异。