我刚刚开始使用Core Data和NSFetchedResultsController,但有点卡住了。我有一个Book实体,其类别属性为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还是可以使它工作?
答案 0 :(得分:1)
...一本书应该能够显示在多个类别(和“收藏夹视图”部分)中。
我应该放弃使用NSFetchedResultsController还是可以使它工作?
您描述的内容无法使用获取的结果控制器来实现。
NSFetchedResultsController
提取所有获取的对象(可能是
由谓词过滤),然后根据排序描述符对它们进行排序,然后
根据{{1}}参数对它们进行分组。
获取的结果控制器无法提供相同的对象 多次(在相同或不同的部分)。
答案 1 :(得分:0)
我认为将category属性保留为字符串没有任何问题。只需更改您处理书籍系列的方式即可。
进行一系列分类,例如
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
中的每个数组,使用booksInCategories数组来显示属于每个部分下每个类别的所有图书。