gpt4 book ai didi

ios - SwiftUI:通过数据库连接实现评级 View

转载 作者:行者123 更新时间:2023-11-30 10:25:33 24 4
gpt4 key购买 nike

在我的应用程序中,我希望用户对电影进行评分。电影从 REST 接口(interface)加载,评级应存储在本地。问题是我不知道如何保留用户的新评分。

我可以从数据库加载评级并更改 MovieRow 中的值,但我不知道如何获取回调以保存更改后的评级。

这是我所拥有的:

struct RatingView: View {

@Binding var rating: Int

var maximumRating = 5
var offImage: Image?
var onImage = Image(systemName: "star.fill")
var offColor = Color.gray
var onColor = Color.yellow

var body: some View {
HStack {

ForEach(1..<maximumRating + 1) { number in
self.image(for: number)
.foregroundColor(number > self.rating ? self.offColor : self.onColor)
.onTapGesture {
self.rating = number
}
}
}
}

func image(for number: Int) -> Image {
if number > rating {
return offImage ?? onImage
} else {
return onImage
}
}
}

struct MovieRow: SwiftUI.View {

let movie: Movie
@State var ownRating: Int

var body: some SwiftUI.View {
ZStack(alignment: Alignment(horizontal: .leading, vertical: .bottom)) {
ZStack(alignment: Alignment(horizontal: .trailing, vertical: .top
)) {
KFImage(movie.fullPosterURL)
.cancelOnDisappear(true)
.resizable()
.frame(height: 250)
RatingView(rating: $ownRating)
.padding([.top, .trailing], 20.0)
}
Text(movie.title)
.font(.largeTitle)
.padding(.all)
.background(Color(.darkGray)
.opacity(0.5))
.foregroundColor(.white)
}
}
}

struct MovieListView: View {

@ObservedObject var viewModel = MovieViewModel()

var body: some View {
List{
ForEach(viewModel.movies) { movie in
MovieRow(movie: movie, ownRating: self.viewModel.ratingForMovieId(id: movie.id))
.listRowInsets(EdgeInsets())
}
}
}
}

class MovieViewModel: ObservableObject{

private let provider: NetworkManager?
private let ratingModel = RatingModel()

@Published var movies = [Movie]()

init(provider: NetworkManager? = NetworkManager(), movies: [Movie] = []) {
self.provider = provider
self.movies = movies

loadNewMovies()
}

func loadNewMovies(){
provider?.getNewMovies(page: 1) {[weak self] movies in
print("\(movies.count) new movies loaded")
self?.movies.removeAll()
self?.movies.append(contentsOf: movies)}
}

func ratingForMovieId(id: Int)->Int{
return ratingModel.ratingForMovieId(movieId: id)
}
}

class RatingModel{

let realm = try! Realm()

func ratingForMovieId(movieId: Int)->Int{

let result = realm.objects(MovieRating.self).filter("movieId = %@", movieId)

guard let movieRating = result.first else{
return 0
}
return movieRating.rating
}

func updateRating(movieId: Int, rating: Int){

try! realm.write {
realm.create(MovieRating.self, value: ["movieId": movieId, "rating": rating], update: .modified)
}
}

}

最佳答案

要给出具体答案,您必须提供有关数据库/ViewModel/REST 接口(interface)的更多信息

一些可能会解决您的问题的内容 @State var ownRating: Int@Binding var ownRating: IntState 旨在仅在 View 中使用,并且应声明为 privateBinding 将传递与 ViewModel< 的连接

激活 onTapGesture 时,引用您的 ViewModel 并使用 REST 接口(interface)预先建立的 save()/update() 。

如果您的保存/更新方法需要对象/id,您可能必须将整个 Movie 对象或 id 变量传递给 RatingView坚持下去。

评分更改时用户界面的刷新取决于发生某事的“ping”或“通知”。 SwiftUI 及其教程在这方面严重依赖 CoreData。

我对 Realm 不熟悉,但这是我能收集到的关于它的信息。 Realm 具有 NotificationTokens,它将为可观察对象中的 SwiftUI 更新提供所需的通知。

获取 ListView 的对象 - How to use Realm with SwiftUI

入门指南 - https://realm.io/docs/swift/latest/

带有 UITableView 查询代码的教程应该是您所需要的 - https://academy.realm.io/posts/meetup-jp-simard-mastering-realm-notifications/

使用观察 Realm 对象对 ListView 进行故障排除 - Index out of bounds when using Realm with SwiftUI

创建领域数据模型并保存 - https://learnappmaking.com/realm-database-swift-getting-started/

您应该使用标准 CRUD 方法创建一个 ObservableObject。

UI 中的

Movie 对象 -> Realm 中的 ViewModel.create(newMovie: Movie) -> 通知/保存 @Published var movie 使用来自 Realm 的新查询

ViewModel init()Realm 检索 [Movie] -> 设置 NotifiationToken 使用 Realm 的新查询来观察@Published var movie

从 UI 更新了 Movie. rating -> Realm 中的 ViewModel.update(updatedMovie) -> 使用 Realm 中的新查询通知/更新 @Published var movie

删除的操作方式与其他操作相同。

关于如何持久化有很多不同的方法,这当然不是最有效的,因为它每次都会检索整个查询,但它应该可以帮助您入门。 NotificationToken 似乎支持使用正确的 NotificationToken.observer 进行精确到字母的更新。

特别针对您的代码。当用户onTapGesture新评级时,您应该引用viewModel.update(updatedMovie: UpdatedMovie),然后 View 将在获取新的电影列表时发生变化来自 NotificationToken 的 code>。

关于ios - SwiftUI:通过数据库连接实现评级 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60077252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com