使用NSFetchedResultsController进行排序时,一个对象在多个部分中。

3

我刚开始使用Core Data和NSFetchedResultsController,现在遇到了困难。我有一个Book实体,其中有一个类型为String的category属性。这些数据被加载到集合视图中,并根据此类别分组成部分。这种方式一切都很正常,但问题是一本书应该能够出现在多个类别(和集合视图部分)中。我可以将类别的类型更改为String数组,但那么如何进行排序呢?

let request = Book.fetchedRequest() as NSFetchRequest<Book>
let categorySort = NSSortDescriptor(key: #keyPath(Book.category)), ascending:true)
request.sortDescriptors = [categorySort]

do {
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: #keyPath(Book.category)), cacheName: nil) 
try fetchedResultsController.performFetch()
} catch let error as NSError {
print(“Could not fetch. \(error), \(error.userInfo)”)
}

我应该放弃使用NSFetchedResultsController吗,还是有可能使它工作?
2个回答

3

... 一本书应该能够出现在多个类别(以及集合视图节)中。

我该放弃使用NSFetchedResultsController吗?还是有可能使其工作?

使用NSFetchedResultsController无法实现您所描述的功能。 NSFetchedResultsController获取所有获取到的对象(可能通过谓词进行过滤),根据排序描述符对它们进行排序,并根据sectionNameKeyPath参数对它们进行分组。

没有办法让获取到的结果控制器将同一个对象多次提供(在同一部分或不同部分中)。


0

我认为将类别属性保留为字符串没有任何问题。只需改变您处理书籍数组的方式即可。

创建一个类别数组,例如

var booksInCategories: [[Book]] = []

这个变量将包含每个数组中一个类别的所有书籍。假设您的书籍数组被称为books

var books: [Book] = []

然后将每本书放入每个类别中,并将其添加到booksInCatogories对象中。假设您拥有所有类别的另一个字符串数组。

var categories = ["Fiction", "Science", "Children", "Education"] // just an example

如果有n个类别,那么在booksInCatogories中会有n个书籍数组。
for category in categories {
    var booksInCategory: [Book] = []
    for book in books {
        if book.category.range(of: category) != nil { // checks if category string contains particular category
            booksInCategory.append(book)
        }
    }
    if booksInCategory.count > 0 { // to exclude empty array if a category doesn't have any books under it
        booksInCategories.append(booksInCategory)
    }
}

现在,您可以使用booksInCategories数组,在每个部分下使用每个数组来显示属于每个类别的所有书籍。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接