来自 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 }
我有一个 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 }