从 fetchedResultsController 获取不需要的节数

Getting undesired number of sections from fetchedResultsController

我在让 tableView 正确更新时遇到问题,尽管我已经取得了一些进展。我认为问题的根源在于我的 fetchedResultsController 返回了不需要的节数。

我的 objective 是让 SongSequences 显示在按 songSequenceTitle 排序的一个部分中。我对 fetchedResultsController 所做的工作最终将每个 SongSequence 视为一个新部分。

我有 Songs 作为 NSOrderedSet 添加到 SongSequence。这是我的 NSManagedObjects 的样子:

extension SongSequence {

    @NSManaged var songSequenceTitle: String!
    @NSManaged var songs: NSOrderedSet!

}

extension Song {

    @NSManaged var favorite: NSNumber!
    @NSManaged var songDescription: String!
    @NSManaged var songFilename: String!
    @NSManaged var songStar: String?
    @NSManaged var songSequences: NSOrderedSet!

}

当我将它们从 managedObjectContext 中拉出来时,我的 fetchedResultsController 将每个 SongSequence 视为一个单独的部分,这对我的 NSFetchedResultsController 委托方法造成了严重破坏和 tableViewmanagedObjectContext 更改时更新方法。

lazy var fetchedResultsController: NSFetchedResultsController = {
    let fetchRequest = NSFetchRequest(entityName: "SongSequence")
    let sortDescriptor = NSSortDescriptor(key: "songSequenceTitle", ascending: true);
    fetchRequest.sortDescriptors = [sortDescriptor]

    let frc = NSFetchedResultsController (fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: "songSequenceTitle", cacheName: nil)

    frc.delegate = self

    return frc
}()

我很困惑为什么 fetchedResultsController 将每个 SongSequence 视为一个单独的部分。

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    print("PlaylistVC numberOfSectionsInTableView = \(fetchedResultsController.sections!.count)")
    // This is equal to the number of SongSequences in my MOC
    return fetchedResultsController.sections!.count
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // This is always 1
    let numberOfRowsInSection = fetchedResultsController.sections?[section].numberOfObjects
    return numberOfRowsInSection!
}

如何在一个部分中显示所有 SongSequences

在您的抓取结果控制器中,您指定了一个 non-nil sectionNameKeyPath。这是按标题对歌曲序列进行分组,并且由于每个歌曲序列标题都是不同的,因此每个歌曲都出现在自己的部分中。

A key path on result objects that returns the section name. Pass nil to indicate that the controller should generate a single section.

通过将 sectionNameKeyPath 设置为 nil 来初始化您的 frc,以避免按部分对歌曲序列进行分组。

let frc = NSFetchedResultsController (fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)