使用NSFetchedResultsController

时间:2018-08-20 06:06:22

标签: ios swift core-data nsfetchedresultscontroller collectionview

我刚刚开始使用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还是可以使它工作?

2 个答案:

答案 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数组来显示属于每个部分下每个类别的所有图书。