Swift - 按部分对核心数据进行排序

Posted

技术标签:

【中文标题】Swift - 按部分对核心数据进行排序【英文标题】:Swift - Sorting core data in sections 【发布时间】:2015-01-01 23:13:03 【问题描述】:

我已经设法按字母顺序对从核心数据接收到的数据进行排序,现在我想将用户名放在每个字母的部分中。我知道最简单的方法是使用 NSFetchedResultsController,但我不知道如何使用它(很少有关于 Swift 的教程)。

所以我的代码如下所示:

override func viewDidAppear(animated: Bool) 

    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context:NSManagedObjectContext = appDel.managedObjectContext!
    let freq = NSFetchRequest(entityName: "Message")
    let en = NSEntityDescription.entityForName("Message", inManagedObjectContext: context)

    let fetchRequest = NSFetchRequest(entityName: "Message")
    let sortDescriptor = NSSortDescriptor(key: "username", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]

    myList = context.executeFetchRequest(fetchRequest, error: nil) as [Model]

    tv.reloadData()    


func numberOfSectionsInTableView(tableView: UITableView) -> Int 

    return 1


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int

    return myList.count

我希望有人能对 NSFetchedResultsController 有所了解并帮助我继续前进。

如果我没有完全错,初始化看起来像这样,虽然我无法弄清楚“缓存名称”:

let resultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: myList, sectionNameKeyPath: "username", cacheName: <#String?#>)

任何关于如何进行的建议将不胜感激。

【问题讨论】:

您是否阅读过描述cacheName 参数的NSFetchedResultsController class documentation?其中哪一部分没有意义? @TomHarrington 这实际上根本不是一个简单的答案。它涉及瞬态核心数据、NSManagedObject 子类化,然后最终使用 NSFetchedResultsController ......并且不需要缓存。我正在考虑写一个答案,但它会很长...... 什么是“瞬态”核心数据? @TomHarrington 这是一种非标准的持久核心数据属性,用于在核心数据中创建临时和动态的“用户名初始”属性,以供 NSFetchedResultsController 使用。此 Apple 文档中提供的信息:developer.apple.com/library/mac/documentation/Cocoa/Conceptual/… 哦,瞬态属性 【参考方案1】:

您可以通过复制和调整 Xcode 模板中的代码来轻松设置获取结果控制器。 (新建一个项目,Master-Detail,勾选“Use Core Data”,从MasterViewController复制。)

以下不是理想的解决方案,但我认为它适合您的经验水平。当您将username 属性添加到Message 实体对象时,还要添加另一个带有第一个字母的属性。然后在创建获取结果控制器时使用这个新属性的 name 作为sectionNameKeyPath 参数。

不要太担心缓存参数。您可以将任何字符串放在那里,例如"Root",或者甚至传递nil 以不使用缓存,这在大多数用例中也可以。

【讨论】:

以上是关于Swift - 按部分对核心数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在表格视图部分中对核心数据对象进行排序

使用 FetchedResultsController 按日期对核心数据进行排序

如何使用姓氏对核心数据进行排序,只有全名可用?

按创建排序表格视图单元格(swift)

核心数据按格式化日期排序表格视图

按 ID 对核心数据进行排序 [重复]