我试图返回具有不同值的NSFetchRequest
。这是我有:从NSFetchRequest获取唯一结果
class Tag: NSManagedObject {
static let entityName = "\(Tag.self)"
static var allTagsRequest: NSFetchRequest<NSFetchRequestResult> = {
let request = NSFetchRequest<NSFetchRequestResult>(entityName: Tag.entityName)
request.sortDescriptors = [NSSortDescriptor(key: "title", ascending: true)]
return request
}()
static var uniqueTagsRequest: NSFetchRequest<NSFetchRequestResult> = {
let request = NSFetchRequest<NSFetchRequestResult>(entityName: Tag.entityName)
request.sortDescriptors = [NSSortDescriptor(key: "title", ascending: true)]
request.resultType = .dictionaryResultType
request.returnsDistinctResults = true
return request
}()
}
的allTagsRequest
返回正确的,即它返回所有存储在CoreData的标签 - 即使是重复的。我希望uniqueTagsRequest
只返回唯一标签,但是当我这样做时,tableView不会填充。这里是我的tableView代码:
class SortableDataSource<SortType: CustomTitleConvertible>: NSObject, UITableViewDataSource where SortType: NSManagedObject {
let kReuseIdentifier = "sortableItemCell"
fileprivate let fetchedResultsController: NSFetchedResultsController<NSFetchRequestResult>
var results: [SortType] {
return fetchedResultsController.fetchedObjects as! [SortType]
}
init(fetchRequest: NSFetchRequest<NSFetchRequestResult>, managedObjectContext moc: NSManagedObjectContext) {
self.fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
super.init()
executeFetch()
}
func executeFetch() {
do {
try fetchedResultsController.performFetch()
} catch let error as NSError {
let alertController = UIAlertController(
title: "Error",
message: "\(error.debugDescription)",
preferredStyle: .alert)
let okAction = UIAlertAction(
title: "Ok",
style: .cancel,
handler: nil)
alertController.addAction(okAction)
UIApplication.topViewController()?.present(alertController, animated: true, completion: nil)
}
}
//MARK: - UITableViewDataSource
func numberOfSections(in tableView: UITableView) -> Int { return 2 }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch section {
case 0: return 1
case 1: return fetchedResultsController.fetchedObjects?.count ?? 0
default: return 0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: kReuseIdentifier)
cell.selectionStyle = .none
switch (indexPath.section, indexPath.row) {
case (0, 0):
cell.textLabel?.text = "All \(SortType.self)s"
cell.accessoryType = .checkmark
case (1, _):
guard let sortItem = fetchedResultsController.fetchedObjects?[indexPath.row] as? SortType else { break}
cell.textLabel?.text = sortItem.title
default: break
}
return cell
}
}
和排序控制器:
@objc fileprivate func presentSortController() {
let tagDataSource = SortableDataSource<Tag>(fetchRequest: Tag.uniqueTagsRequest, managedObjectContext: CoreDataController.sharedInstance.managedObjectContext)
let sortItemSelector = SortItemSelector(sortItems: tagDataSource.results)
let sortController = PhotoSortListController(dataSource: tagDataSource, sortItemSelector: sortItemSelector)
sortController.onSortSelection = { checkedItems in
if !checkedItems.isEmpty {
var predicates = [NSPredicate]()
for tag in checkedItems {
let predicate = NSPredicate(format: "%K CONTAINS %@", "tags.title", tag.title)
predicates.append(predicate)
}
let compoundPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)
self.dataSource.performFetch(withPredicte: compoundPredicate)
} else {
self.dataSource.performFetch(withPredicte: nil)
}
}
let navController = UINavigationController(rootViewController: sortController)
present(navController, animated: true, completion: nil)
}
谢谢你们!
一些铸造后它像一个魅力工作 - 谢谢! –