swift - 如何在 Swift 中将可转换属性保存到 Core Data
问题描述
我正在构建一个从 TMDB 获取电影数据的 SwiftUI 应用程序。当用户将电影添加到他们的观看列表时,我试图将数据保存为 Core Data 中的可转换属性。
问题是我无法保存数据。
我为 TransformableMovie 实体创建了 NSManagedObject NSManagedObject 子类:
TransformableMovie+CoreDataClass.swift
import Foundation
import CoreData
@objc(TransformableMovie)
public class TransformableMovie: NSManagedObject {
}
TransformableMovie+CoreDataProperties.swift
import Foundation
import CoreData
extension TransformableMovie {
@nonobjc public class func fetchRequest() -> NSFetchRequest<TransformableMovie> {
return NSFetchRequest<TransformableMovie>(entityName: "TransformableMovie")
}
@NSManaged public var movie: MovieClass?
}
这是我创建的类:
MovieClass.swift
import Foundation
public class MovieClass: NSObject, NSCoding {
var movie: Movie
init(movie: Movie) {
self.movie = movie
}
required public init?(coder aDecoder: NSCoder) {
self.movie = aDecoder.decodeObject(forKey: "movie") as! Movie
}
public func encode(with aCoder: NSCoder) {
aCoder.encode(movie, forKey: "movie")
}
}
这是我试图保存数据的视图(在 navigationBarItems 按钮中)
MovieDetailView.swift
import SwiftUI
import CoreData
struct MovieDetailView: View {
@ObservedObject private var detailVM = MovieDetailViewModel()
// Core data
@Environment(\.managedObjectContext) var managedObjectContext
var movie: Movie
@State private var showingAlert = false
init(movie: Movie) {
self.movie = movie
detailVM.getMovieDetails(id: movie.id)
// Stop Scrollview bounce
UIScrollView.appearance().bounces = false
}
var body: some View {
VStack {
...
}.navigationBarTitle(movie.title)
.navigationBarItems(trailing:
Button(action: {
// Save to core data
let movieToBeSaved = TransformableMovie(context: self.managedObjectContext)
movieToBeSaved.movie?.movie = detailVM.fetchedMovie!
self.showingAlert = true
do {
try self.managedObjectContext.save()
} catch {
// handle the Core Data error
}
}) {
Image(systemName: "plus")
.renderingMode(.original)
}.alert(isPresented: $showingAlert) {
Alert(title: Text("Saved"), message: Text("Movie added to your watch list"), dismissButton: .default(Text("Ok")))
})
}
}
任何帮助将不胜感激。
解决方案
我认为问题在于这一行:
movieToBeSaved.movie?.movie = detailVM.fetchedMovie!
该movie?
属性为零,因此分配永远不会起作用。从您提供的代码中很难看出,但我认为您需要先创建一个ModelClass
对象,然后分配它:
let movieModel = ModelClass(movie: detailVM.fetchedMovie)
movieToBeSaved.movie = movieModel
推荐阅读
- microsoft-graph-api - 无法通过 API 获取照片,返回 404
- javadoc - 类似 Citrus 框架的 Javadoc 文档
- node.js - 大集合batchSize的mongoDB查询
- google-cloud-platform - Google Cloud Builder - 如何在子目录中触发构建配置?
- reactjs - Material-UI 主题覆盖问题
- php - Laravel - 是否可以对一组属性使用验证规则?
- javascript - django使用模板视图和ajax
- flutter - 通知孩子在父母 onTap 的某个地方发生了
- javascript - 从全局范围内的函数访问局部变量
- c# - WPF:如何防止滚动条覆盖列表类型视图中的标题