NSFetchedResultsController 的 tableView 中的不同部分与核心数据记录中的部分不同

Different sections in tableView from NSFetchedResultsController than in Core Data records

我有 2 个实体:ProductsPackage 产品具有 name,weight,price 并且与包装的关系 pack->对许多 包有 name,我将它用于我的 tableView 中的部分。

产品是用 textFields 创建的,tableView 是用 [Package] 填充的。在核心数据中,我将 pack 记录为 selectedRow Package ,但是当我使用 Products 打开 tableView 时,产品位于不同的包(部分)中,而不是我在 [=13 的 tableView 中选择的=]

核心数据的结果:

"prod4"
<Packings: 0x2817a5770> (entity: Packings; id: 0xbf7e2ae6e8ae5fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p1>; data: <fault>)

"prod3"
<Packings: 0x2817b2cb0> (entity: Packings; id: 0xbf7e2ae6e8a65fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p3>; data: <fault>

"prod2"
<Packings: 0x2817b2d50> (entity: Packings; id: 0xbf7e2ae6e8a25fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p2>; data: <fault>)

"prod1"
<Packings: 0x2817a5770> (entity: Packings; id: 0xbf7e2ae6e8ae5fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p1>; data: <fault>)

如您所见,prod1、prod2、prod3 应引用 pack1、pack2、pack3,在打印中描述为 p1、p2、p3。 prod4 被引用到 p1。但它们在 Products tableView 中的排列完全不同:

代码:

let fetchRequest:NSFetchRequest<Products> = Products.fetchRequest()
fetchRequest.returnsObjectsAsFaults = false
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "productId", ascending: false)]
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: (UIApplication.shared.delegate as? AppDelegate)!.persistentContainer.viewContext, sectionNameKeyPath: "pack.name", cacheName: nil) as? NSFetchedResultsController<NSFetchRequestResult>
fetchedResultsController!.delegate = self
try fetchedResultsController!.performFetch()



func numberOfSections(in tableView: UITableView) -> Int {
    return fetchedResultsController?.sections?.count ?? 0
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return fetchedResultsController?.sections![section].name
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return fetchedResultsController!.sections![section].numberOfObjects
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let product = fetchedResultsController!.object(at: indexPath) as! Products
}

要正确排序部分,您必须在第一个位置指定适当的排序描述符。

fetchRequest.sortDescriptors = [NSSortDescriptor(key: "pack.name", ascending: false),
                                NSSortDescriptor(key: "productId", ascending: false)]