Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData在保存筛选的FetchedResults时崩溃_Ios_Swift_Swiftui - Fatal编程技术网

Ios CoreData在保存筛选的FetchedResults时崩溃

Ios CoreData在保存筛选的FetchedResults时崩溃,ios,swift,swiftui,Ios,Swift,Swiftui,我有一个fetchRequest,然后过滤FetchedResults数组。如果我在列表中显示过滤后的对象,并尝试删除其中一个并保存,则会崩溃 我得到这个错误代码:线程1:同时访问0x7FE28344B28,但修改需要独占访问 我试图用NSPredicate筛选fetchRequest,但随后它也崩溃了 struct ListView: View { @FetchRequest( entity: Item.entity(), sortDescriptors: [

我有一个fetchRequest,然后过滤FetchedResults数组。如果我在列表中显示过滤后的对象,并尝试删除其中一个并保存,则会崩溃

我得到这个错误代码:线程1:同时访问0x7FE28344B28,但修改需要独占访问

我试图用NSPredicate筛选fetchRequest,但随后它也崩溃了

struct ListView: View {
    
    @FetchRequest(
        entity: Item.entity(), sortDescriptors: []
    ) var itemList: FetchedResults<Item>
    
    @Environment(\.managedObjectContext) var viewContext
    
    var filteredItemList: Array<Item> { 
        return itemList.filter { $0.name == "TestItem1" }
    }
    
    var body: some View {
        
        List {
            ForEach(filteredItemList, id: \.self) { item in
                Text(item.name)
            }
            .onDelete(perform: removeItem(at:))
        }
    }
    
    private func removeItem(at offsets: IndexSet) { // Zum Entfernen von Sets durch Wischfunktion
        
        for index in offsets {
            let item = filteredItemList[index]
            viewContext.delete(item)
        }
        
        try? self.viewContext.save()
    }
}
结构列表视图:视图{ @获取请求( 实体:Item.entity(),排序描述符:[] )var itemList:FetchedResults @环境(\.managedObjectContext)变量viewContext var filteredItemList:数组{ return itemList.filter{$0.name==“TestItem1”} } var body:一些观点{ 名单{ ForEach(filteredItemList,id:\.self){中的项 文本(项目名称) } .onDelete(执行:removietem(在:)) } } 私有函数删除项(偏移量处:索引集){//Zum Entfernen von set durch wischfunkion 对于偏移量中的索引{ let item=filteredItemList[索引] viewContext.delete(项目) } 试试?self.viewContext.save() } }
我找到了一种方法来延迟另一个堆栈溢出线程中的一些代码,现在它可以工作了。我用0.1秒的延迟测试了它。甚至可以在更小的延迟下工作

只需在removeItem函数中添加此代码

let seconds = 0.1
        DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
             //Put your code which should be executed with a delay here
            try? self.viewContext.save()
            print("Saved")
        }

我想我找到了一种适合我的项目的方法。看看我的答案。