我正在构建一个应用,该应用从The Movie Database API中获取数据并按流派显示电影列表。
在我的视图模型中,我有一个调用api并通过可观察对象使数据可用的函数。
import Foundation
class MovieListViewModel: ObservableObject {
@Published var movies = [Movie]()
private var fetchedMovies = [MovieList]()
var page = 1
func fetchMovies(genre: Int) {
WebService().getMoviesByGenre(genre: genre, page: page) { movie in
if let movie = movie {
self.fetchedMovies.append(movie)
for movie in movie.movies {
self.movies.append(movie)
}
}
}
page += 1
print(page)
}
}
在视图内部,我使用onAppear调用该函数并传递从上一个视图接收的流派ID(Int)。这一切都按预期工作。
import SwiftUI
struct MovielistView: View {
@ObservedObject private var movielistVM = MovieListViewModel()
var genre: GenreElement
var body: some View {
List {
...
}
}.onAppear {
self.movielistVM.fetchMovies(genre: self.genre.id)
}
.navigationBarTitle(genre.name)
}
}
问题是因为我使用的是onAppear,因此每次用户导航回到该视图时,api都会被命中/视图将刷新。
理想情况下,我想在视图模型初始化期间调用一次api,但是由于genre属性尚未初始化,因此无法将参数传递给视图模型。
我已经尝试过(如下),但是在初始化所有存储的属性之前得到错误'self'
import SwiftUI
struct MovielistView: View {
@ObservedObject private var movielistVM = MovieListViewModel()
var genre: GenreElement
init() {
movielistVM.fetchMovies(genre: genre.id) // Error here
}
var body: some View {
List {
...
}
.navigationBarTitle(genre.name)
}
}
任何帮助将不胜感激。
答案 0 :(得分:0)
为genre
添加一个init
参数,并在使用之前初始化genre
的{{1}}属性:
MovielistView