核心数据 NSManagedObject - ObservedObjects 未更新

Posted

技术标签:

【中文标题】核心数据 NSManagedObject - ObservedObjects 未更新【英文标题】:Core Data NSManagedObject - ObservedObjects not updating 【发布时间】:2020-07-21 16:48:05 【问题描述】:

我有一个数据输入视图,允许用户添加图像并在添加后查看预览。

ImagePickerView 我返回了一个UIImage,我通过.pngData 转换器将它作为Data 类型保存到Core Data。但是,选择图像后,即使我使用@ObservedObjectobjectWillChange,视图也不会更新以显示它

我不能使用@State,因为草稿对象是NSManagedObject

import SwiftUI
import CoreData

struct AddItemView: View 
    @Environment(\.managedObjectContext) var moc
    @Environment (\.presentationMode) var presentationMode
    
    @State var showImagePicker: Bool = false
    
    @ObservedObject var draft: Item    //Core Data entity
                        
    var body: some View 
        
        NavigationView 
            VStack 
                if (draft.image != nil) 
                    Image(uiImage: UIImage(data: draft.image!)!)
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: UIScreen.main.bounds.width - 32, height: UIScreen.main.bounds.height / 4)
                        .clipShape(RoundedRectangle(cornerRadius: 20))
                 else 
                    Button(action: 
                        self.showImagePicker = true
                    , label: 
                        RoundedRectangle(cornerRadius: 20)
                    )
                    .padding([.all], 20)
                

            
            .sheet(isPresented: $showImagePicker) 
                ImagePickerView(sourceType: .photoLibrary)  image in
                    draft.objectWillChange.send()
                    draft.image = image.pngData()
                
            

            
        
    

【问题讨论】:

【参考方案1】:

尝试使用objectWillChange.send()您做出更改后:

.sheet(isPresented: $showImagePicker) 
    ImagePickerView(sourceType: .photoLibrary)  image in
        draft.image = image.pngData() // #1
        draft.objectWillChange.send() // #2
    

【讨论】:

hmm.. 不幸的是,即使在重新排列它们之后,这对我来说也以同样的行为结束

以上是关于核心数据 NSManagedObject - ObservedObjects 未更新的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 NSManagedObject 更改

核心数据 - NSManagedObject(有关系)到 JSON

核心数据 NSManagedObject:最大属性数?

将 NSManagedObject 更新为核心数据

核心数据 - 遍历 NSManagedObject 的属性

多线程核心数据 - NSManagedObject 无效