Ios 在其他视图中更新核心数据属性时,SwiftUI列表不更新

Ios 在其他视图中更新核心数据属性时,SwiftUI列表不更新,ios,core-data,swiftui,swiftui-list,Ios,Core Data,Swiftui,Swiftui List,现在,我推到“详细视图”一个对象: .onAppear(){ self.loadDocuments() } 在重命名文档视图中: NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!]), isActive: $pushActive) { Text("") }.hid

现在,我推到“详细视图”一个对象:

.onAppear(){
     self.loadDocuments()
 }
在重命名文档视图中:

NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!]), isActive: $pushActive) {
                    Text("")
                }.hidden()
此外,还有一个更新文档名称的函数:

var document: ScanDocument
所有这些代码都有效。此打印语句始终打印更新的值:

func renameDocument() {
    guard !fileName.isEmpty else {return}
    document.name = fileName
    try? self.moc.save()
    print(fileName)
    self.presentationMode.wrappedValue.dismiss()
}
以下是主视图中的列表代码:

print(documents.compactMap({$0.name}))
但用户返回到上一个屏幕。该列表显示旧数据。如果我重新启动应用程序,它会显示新数据

任何朝着新方向推动的帮助都会有所帮助


这里有一个类似的问题:,但没有答案。

NSManagedObject
是一个引用类型,因此当您更改其属性时,
文档不会更改,因此状态不会刷新视图

这里有一种可能的方法,可以在您返回时强制刷新列表

  • 添加新状态
  • 由it确定的制造清单
  • 备选方案:可能的备选方案是让
    DocumentCell
    观察文档,但没有提供代码,因此不清楚里面是什么。无论如何你可以试试

    NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!])
                                   .onDisappear(perform: {self.refreshID = UUID()}), 
                    isActive: $pushActive) {
                        Text("")
                    }.hidden()
    

    核心数据批处理更新不会更新内存中的对象。之后必须手动刷新

    批处理操作绕过正常的核心数据操作,直接在底层SQLite数据库(或支持持久存储的任何数据库)上操作。它们这样做是为了提高速度,但这意味着它们也不会触发使用普通获取请求获得的所有内容

    您需要执行类似于《苹果核心数据批处理编程指南:实施批处理更新-执行后更新应用程序》中所示的操作

    let request=NSBatchUpdateRequest(实体:scandDocument.entity())
    request.resultType=.UpdateObjectDSResultType
    让result=try viewContext.execute(request)as?NSBatchUpdateResult
    让ObjectDarray=结果?结果为?[NSManagedObjectID]
    let changes=[nsUpdate对象skey:ObjectDarray]
    NSManagedObjectContext.mergeChanges(从RemoteContextSave:changes,到:[managedContext])
    
    List(documents, id: \.id) { item in
         ZStack {
              DocumentCell(document: item)
         }
    }
    
    @State var documents: [ScanDocument] = []
    @State private var refreshID = UUID()   // can be actually anything, but unique
    
    List(documents, id: \.id) { item in
         ZStack {
              DocumentCell(document: item)
         }
    }.id(refreshID)     // << here
    
    NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!])
                                   .onDisappear(perform: {self.refreshID = UUID()}), 
                    isActive: $pushActive) {
                        Text("")
                    }.hidden()
    
    struct DocumentCell: View {
       @ObservedObject document: ScanDocument
     
       ...
    }