NSFetchedResultsController节号为0

时间:2016-03-06 12:54:50

标签: ios swift uitableview nsfetchedresultscontroller

我有以下实体层次结构 enter image description here

在我的TableViewController中,我有以下代码:

private lazy var fetchedResultsController: NSFetchedResultsController = {
    let fetchRequest = NSFetchRequest(entityName: "Worker")
    let workerTypeSortDescriptor = NSSortDescriptor(key: "workerType", ascending: true)
    let firstNameSortDescriptor = NSSortDescriptor(key: "firstName", ascending: true)

    fetchRequest.sortDescriptors = [workerTypeSortDescriptor,  firstNameSortDescriptor]
    guard let stack = CoreDataStackSingleton.sharedInstance.coreDataStack else {return NSFetchedResultsController()}
    let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: stack.mainQueueContext, sectionNameKeyPath: "workerType", cacheName: nil)
    frc.delegate = self
    return frc
}()
...
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    if let sections = fetchedResultsController.sections {
        print(sections.count)
        return sections.count
    }
    return 0
}
...
func viewDidLoad(){
    ...
    try fetchedResultsController.performFetch()
    ...
}

我总是从print(sections.count)获得0我不知道为什么,因为我有3个实体,我假设得到3个部分。这是the project

2 个答案:

答案 0 :(得分:2)

使用组创建frc时,第一个排序描述符必须与组密钥相同。

因此,创建另一个按workerType排序的排序描述符,并将其设置为数组中的第一个排序描述符。 (第二个排序描述符是firstNameSortDescriptor)。

然后应该创建您想要的部分。

另外......您是否在获取的结果控制器上调用performFetch

你需要调用它来让frc工作。

答案 1 :(得分:1)

假设您的coredata堆栈正常工作,并且您在每种类型的上下文中都插入了记录,这应该可行。但是如果你的上下文是空的,那么我希望该部分计数为0.