我有一个使用来自CoreData和NSFetchedResultsController的数据填充的表。它使用一个具有布尔值的属性填充两个部分。但我想把每个部分的数据分成两个数组,以便进一步处理。
是否有方法将获取的结果控制器生成的两个部分中的数据保存到单独的数组中。
我尝试使用用于使用代码创建节的属性值创建两个谓词:
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()
更改之前,必须调用fetchedObjects
。
相反,你可以使用过滤器。
let frequent = fetchedObjects.filter() { $0.frequent }
let infrequent = fetchedObjects.filter() { !$0.frequent }
关于ios - 来自NSFetchedResultsController的两个数组swift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30969504/