来自 NSFetchedResultsController swift 的两个数组

two arrays from NSFetchedResultsController swift

我有一个 table,它使用来自 CoreData 和 NSFetchedResultsController 的数据填充。它使用一个具有布尔值的属性填充两个部分。但是我想把每个section中的数据放到两个数组中做进一步的处理。

有没有办法将Fetched Results Controller生成的两个section中的数据保存到不同的数组中。

我尝试使用用于创建部分的属性值创建两个谓词,使用代码:

var context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
var frc: NSFetchedResultsController = NSFetchedResultsController()
    func getFetchedResultsController() -> NSFetchedResultsController {
    frc = NSFetchedResultsController(
        fetchRequest: fetchRequest(),
        managedObjectContext: context,
        sectionNameKeyPath: "frequent",
        cacheName: nil)
    return frc
}
//Fetch request of done Items to populate the two sections (Frequent and nonFrequent)
func fetchRequest() -> NSFetchRequest {
    let fetchRequest = NSFetchRequest(entityName: "Item")
    let frequentSortDescriptor = NSSortDescriptor(key: "frequent", ascending: false)
    let nameSortDescriptor = NSSortDescriptor(key: "name", ascending: true)
    let predicate = NSPredicate(format: "done == %@", true)
    fetchRequest.predicate = predicate
    fetchRequest.sortDescriptors = [frequentSortDescriptor, nameSortDescriptor]
    return fetchRequest
}

override func viewDidLoad() {
    super.viewDidLoad()

    frc = getFetchedResultsController()
    frc.delegate = self
    frc.performFetch(nil)

    frc.fetchRequest.predicate = NSPredicate(format: "frequent == %@", true)
    if let freqResults = frc.fetchedObjects as? [Item] {
        freq = freqResults
    }

    frc.fetchRequest.predicate = NSPredicate(format: "frequent == %@", false)
    if let nonFreqResults = frc.fetchedObjects as? [Item] {
        nonFreq = nonFreqResults
    }
    println("\(freq.count) Fav and \(nonFreq.count) Non Fav")
}

但是最后的 'println()' 将两个数组打印为每个数组有 10 个计数。但实际上,'freq.count' 应该有 7 个,'nonFreq.count' 应该有 3 个项目,两部分加起来总共有 10 个项目。

这些部分显示了正确的项目。我只是无法将这些项目保存到数组中。

有没有可能是因为第一个 'fetchRequst()' 已经应用了一个谓词,而我正在尝试对它应用第二个谓词或什么?如果是这样,我该如何解决?

您必须先调用 performFetch(),然后 fetched results 控制器的 fetchedObjects 才会发生变化。

相反,您可能只使用过滤器。

let frequent =   fetchedObjects.filter() {   [=10=].frequent }
let infrequent = fetchedObjects.filter() {  ![=10=].frequent }