如何正确插入此SwiftUI CoreData模型的排序描述符?

如何正确插入此SwiftUI CoreData模型的排序描述符?,swift,core-data,mvvm,swiftui,nsfetchrequest,Swift,Core Data,Mvvm,Swiftui,Nsfetchrequest,我正在尝试实现如下所述的MVVM体系结构: 但我在该文件中遇到运行时错误,无法确定在何处添加排序描述符: import Foundation import CoreData import Combine import UIKit class ItemsStorage: NSObject, ObservableObject { var items = CurrentValueSubject<[Item], Never>([]) private let itemFet

我正在尝试实现如下所述的MVVM体系结构:

但我在该文件中遇到运行时错误,无法确定在何处添加排序描述符:

import Foundation
import CoreData
import Combine
import UIKit

class ItemsStorage: NSObject, ObservableObject {
    var items = CurrentValueSubject<[Item], Never>([])
    private let itemFetchController: NSFetchedResultsController<Item>
    
    //SINGLETON INSTANCE
    static let shared: ItemsStorage = ItemsStorage()  ///Run time error: Thread 1: "An instance of NSFetchedResultsController requires a fetch request with sort descriptors"
    
    private override init() {
        
        /// This line doesn't solve the issue
        let sort = NSSortDescriptor(key: "name_", ascending: true)
        
        itemFetchController = NSFetchedResultsController(
        
        fetchRequest: Item.fetchRequest(),
        managedObjectContext: PersistenceController.shared.container.viewContext,
        sectionNameKeyPath: nil, cacheName: nil
        )
        
        /// This line doesn't solve the issue
        itemFetchController.fetchRequest.sortDescriptors = [sort]
        
        super.init()
        
        itemFetchController.delegate = self
        
        do {
            try itemFetchController.performFetch()
            items.value = itemFetchController.fetchedObjects ?? []
        } catch {
            NSLog("Error: could not fetch objects")
        }
    }
    
    func add(){
        
    }
    
    func update(withID id: UUID) {
        
    }
    
    func delete(id: UUID) {
        
    }
}

extension ItemsStorage: NSFetchedResultsControllerDelegate  {
    public func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
        guard let items = controller.fetchedObjects as? [Item] else { return }
        NSLog("Context has changed, reloading items ...")
        self.items.value = items
    }
}
<代码>导入基础 导入CoreData 进口联合收割机 导入UIKit 类项存储:NSObject,observeObject{ var items=CurrentValueSubject([]) 私有let itemFetchController:NSFetchedResultsController //单例实例 静态let shared:ItemsStorage=ItemsStorage()///运行时错误:线程1:“NSFetchedResultsController的实例需要具有排序描述符的获取请求” 私有重写init(){ ///这句话不能解决问题 让sort=NSSortDescriptor(键:“名称”,升序:true) itemFetchController=NSFetchedResultsController( fetchRequest:Item.fetchRequest(), managedObjectContext:PersistenceController.shared.container.viewContext, sectionNameKeyPath:nil,cacheName:nil ) ///这句话不能解决问题 itemFetchController.fetchRequest.sortDescriptors=[sort] super.init() itemFetchController.delegate=self 做{ 请尝试itemFetchController.performFetch() items.value=itemFetchController.FetchedObject???[] }抓住{ NSLog(“错误:无法获取对象”) } } func add(){ } func更新(id:UUID){ } func delete(id:UUID){ } } 扩展项存储:NSFetchedResultsControllerDelegate{ 公共函数控制器IDChangeContent(\uController:NSFetchedResultsController){ guard let items=controller.fetchedObjects as?[Item]else{return} NSLog(“上下文已更改,正在重新加载项…”) self.items.value=项目 } }
在初始化“获取结果”控制器之前,您需要为“获取请求”设置排序描述符:

    let sort = NSSortDescriptor(key: "name_", ascending: true)
    let itemFetchRequest = Item.fetchRequest()
    itemFetchRequest.sortDescriptors = [sort]
    
    itemFetchController = NSFetchedResultsController(
    
    fetchRequest: itemFetchRequest,
    managedObjectContext: PersistenceController.shared.container.viewContext,
    sectionNameKeyPath: nil, cacheName: nil
    )

谢谢但是,我在'let itemFetchRequest=Item.fetchRequest()'行中遇到了一个错误。它说“fetchRequest()的用法不明确”,但在我的Item+Helper.swift文件中,我确实有定义fetchRequest的扩展名,如下所示:
extension Item{static func fetchRequest(upredicate:NSPredicate)->NSFetchRequest{let request=NSFetchRequest(entityName:“Item”)return request}
我还有什么问题吗?好的,再看一看,发现这个问题:它似乎解决了后一个问题。现在我有了这个:
let sort=NSSortDescriptor(键:“name”,升序:true)let itemFetchRequest:NSFetchRequest=Item.fetchRequest()itemFetchRequest.sortDescriptors=[sort]itemFetchController=NSFetchedResultsController(…