NSSortDescriptor 使用实体的 NSDate 属性(Swift)

Posted

技术标签:

【中文标题】NSSortDescriptor 使用实体的 NSDate 属性(Swift)【英文标题】:NSSortDescriptor using NSDate attribute of Entity (Swift) 【发布时间】:2015-04-01 12:50:05 【问题描述】:

我有一个类似于this one 的问题,但有一点不同。

我想知道当核心数据模型如下时,如何在获取请求中返回特定属性(在本例中为“权重”):

客户>评估('Assessment'有一个权重属性)

这是我的客户端类:

@objc(Client)
class Client: NSManagedObject 
    @NSManaged var name: String
    @NSManaged var assessment: NSSet

还有我的评估课:

@objc(Assessment)
class Assessment: NSManagedObject 

    @NSManaged var weight: Int16
    @NSManaged var nsDateOfAssessment: NSDate
    @NSManaged var client: Client


这是我的获取请求。我知道现在我的“权重”数组正在填充托管对象,但我需要的是填充“权重”属性的整数,并按我的日期“nsDateOfAssessment”排序,如 cmets 中所述编码。然后我反过来使用该数组来填充图表。

var client: Client! = nil
var weights = []

func weightFetchRequest() -> NSFetchRequest 
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let managedContext = appDelegate.managedObjectContext!
        let fetchRequest = NSFetchRequest(entityName: "Assessment")
        var error: NSError?

        //Something for getting only 'weight' attribute of assessment
        //Something for sorting 'weights' array by the date attribute 'nsDateOfAssessment' of 'Assessment'

        let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as [NSManagedObject]?

        if let results = fetchedResults 
            weights = results
         else 
            println("Could not fetch \(error), \(error!.userInfo)")
        
        println(weights)

        return fetchRequest
    

如果有更简单的方法,我们将不胜感激。

【问题讨论】:

查看 NSFetchRequest 的文档,特别是 sortDescriptors、谓词和 propertiesToFetch 成员。 【参考方案1】:

您可以通过在 NSFetchRequest 上设置 sortDescriptor 来进行排序。根据您希望结果是升序还是降序传递 true 或 false。

var fetchRequest = NSFetchRequest(entityName: "Assessment")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "nsDateOfAssessment", ascending: false)]

然后您可以使用高阶函数来映射结果以仅获取您想要的权重属性

let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as [Assessment]?

注意我是如何将它设置为您的子类 NSManagedObject 的数组

if let assessments = fetchedResults 
   let weights = assessments.map  assessment in assessment.weight 

【讨论】:

以上是关于NSSortDescriptor 使用实体的 NSDate 属性(Swift)的主要内容,如果未能解决你的问题,请参考以下文章

创建 NSSortDescriptor

仅将 NSSortDescriptor 应用于由 NSFetchedResultsController 的 NSPredicate 过滤的实体

NSFetchedResultsController 与许多 NSSortDescriptor

NSSortDescriptor 与关系

iPhone:无法对多对关系进行 NSSortDescriptor。如何排序?

使用 NSSortDescriptor 对 NSNumber 进行排序