Core data 数据更改时SwiftUI处理SpriteKit场景再现
我有一个连接到Core data 数据更改时SwiftUI处理SpriteKit场景再现,core-data,sprite-kit,swiftui,Core Data,Sprite Kit,Swiftui,我有一个连接到CoreData模型的SwiftUI视图。我还有一个SpriteKit场景,可以更改模型中的数据。因此,每次我在CoreData中操作SKScene中的数据时,我的场景都会重新初始化,这在我的案例中是不必要的行为 如果不重新创建SKScene,如何在我的SpriteView中获取更新的模型 我的代码如下所示: struct TamagotchiListView: View { @Environment(\.managedObjectContext) var context: NS
CoreData
模型的SwiftUI
视图。我还有一个SpriteKit
场景,可以更改模型中的数据。因此,每次我在CoreData中操作SKScene中的数据时,我的场景都会重新初始化,这在我的案例中是不必要的行为
如果不重新创建SKScene
,如何在我的SpriteView
中获取更新的模型
我的代码如下所示:
struct TamagotchiListView: View {
@Environment(\.managedObjectContext)
var context: NSManagedObjectContext
@FetchRequest(fetchRequest: TamagotchiModel.getFetchRequest())
var tamagotchis: FetchedResults<TamagotchiModel>
var body: some View {
VStack {
List {
ForEach(tamagotchis, id: \.self) { (tamagotchi: TamagotchiModel) in
NavigationLink(destination: SpriteKitView(scene: SpriteKitScene(model: tamagotchi))) {
HStack {
Image(systemName: "gamecontroller")
.padding(.trailing, 5)
VStack(alignment: .leading) {
Text(tamagotchi.name)
.font(.headline)
Spacer()
Text(tamagotchi.birthDate, style: .date)
}
Spacer()
}
}
}
}
}
}
struct TamagotchiListView:视图{
@环境(\.managedObjectContext)
变量上下文:NSManagedObjectContext
@FetchRequest(FetchRequest:TamagotchiModel.getFetchRequest())
var tamagotchis:获取结果
var body:一些观点{
VStack{
名单{
ForEach(tamagotchis,id:\.self){(tamagotchi:TamagotchiModel)在
导航链接(目的地:SpriteKitView(场景:SpriteKitScene(型号:tamagotchi))){
HStack{
图像(系统名:“游戏控制器”)
.padding(.training,5)
VStack(对齐:。前导){
文本(tamagotchi.name)
.font(.headline)
垫片()
文本(tamagotchi.birthDate,样式:.date)
}
垫片()
}
}
}
}
}
}
我通过创建一个视图模型来解决我的问题,该模型可以在需要时管理SpriteKit场景的创建
class TamagotchiViewModel {
private var spriteKitScenes: [SpriteKitScene] = []
func scene(for tamagotchi: TamagotchiModel) -> SpriteKitScene {
if let scene = spriteKitScenes.first(where: { $0.tamagotchi?.tamagotchiModel.id == tamagotchi.id}) {
return scene
} else {
let newScene = SpriteKitScene(model: tamagotchi)
spriteKitScenes.append(newScene)
return newScene
}
}
}
需要某种可复制的例子来避免猜测。