Swift:核心数据在tableview中显示唯一记录

Swift:核心数据在tableview中显示唯一记录,swift,tableview,fetch,Swift,Tableview,Fetch,我试图只显示核心数据实体“Persons”中唯一的“name”。从这一点上,我目前正在从“姓名”属性中提取“年龄”、“描述”和“国家”。但是,我希望它只显示每个名称的一个实例(只有唯一的名称),而不是有两个“Bob”、三个“Sara”和七个“Ali”。我试图只在单元格的“名称标签”中显示唯一的名称,而在另一个表视图单元格标签中显示“添加日期”的最新记录。这就是我想要实现的目标: 安德烈亚斯-12/13/2015 阿里-10/10/2015 约翰-2015年4月5日 等等 //虽然可能已经有5个A

我试图只显示核心数据实体“Persons”中唯一的“name”。从这一点上,我目前正在从“姓名”属性中提取“年龄”、“描述”和“国家”。但是,我希望它只显示每个名称的一个实例(只有唯一的名称),而不是有两个“Bob”、三个“Sara”和七个“Ali”。我试图只在单元格的“名称标签”中显示唯一的名称,而在另一个表视图单元格标签中显示“添加日期”的最新记录。这就是我想要实现的目标:

安德烈亚斯-12/13/2015 阿里-10/10/2015 约翰-2015年4月5日

等等

//虽然可能已经有5个Andreas'了,但我只想显示一个,但添加了最新的“日期”

这是我目前拥有的代码,它可以工作,但不过滤任何东西

我的全局变量:

var Names : [NSManagedObject] = []
var Dates : [NSManagedObject] = []
在我的视图中:

let delegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let context = delegate.managedObjectContext


        let request = NSFetchRequest(entityName: "Persons")

        var err:NSError?

        do {

            Names = try context.executeFetchRequest(request) as! [NSManagedObject]
            Dates = try context.executeFetchRequest(request) as! [NSManagedObject]

        } catch let err1 as NSError {
            err = err1
        }

        if err != nil {
            print("Problem loading data..")
        }
在my tableView cellForRowAtIndexPath中:

 let Name = Names[indexPath.row]
        let DateAdded = Dates[indexPath.row]

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell


    if Name.valueForKey("name") != nil {
        cell.nameLabel!.text = Name.valueForKey("name") as! String
    } else {
        cell.nameLabel!.text = ""
    }
    if DateAdded.valueForKey("date") != nil {
        cell.dateLabel!.text = DateAdded.valueForKey("date") as! String
    } else {
        cell.dateLabel!.text = ""
    }


    return cell

任何帮助都将不胜感激,因为我已经为此奋斗了数周,试图解决这个“谜”。

我还没有测试过这段代码,但你应该使用聚合函数来获得你想要的。下面是它应该是什么样子。您可能需要对其进行一些调整,但这应该是可行的

func fetchLastUpdateDates(context: NSManagedObjectContext) -> [String: NSDate] {
    var namesWithDates = [String: NSDate]()

    var properties = [AnyObject]()

    // retrieve the name value in the results
    properties.append("name")

    // retrieve the max value of date in the aggregate
    let latestDateDescription = NSExpressionDescription()
    latestDateDescription.name = "LastDate"
    latestDateDescription.expression = NSExpression(format: "@max.date")
    latestDateDescription.expressionResultType = .DateAttributeType
    properties.append(latestDateDescription)

    let request = NSFetchRequest(entityName: "Persons")
    // aggregate by "name" - results in one entry per name
    request.propertiesToGroupBy = ["name"]

    // need to use the "dictionary" result type because aggregate doesn't represent an actual record
    request.resultType = .DictionaryResultType
    request.propertiesToFetch = properties

    context.performBlockAndWait {
        do {
            if let results = try context.executeFetchRequest(request) as? [[String: AnyObject]] {
                // convert the results in to name-date dictionary
                for result in results {
                    if let name = result["name"] as? String, date = result["LastDate"] as? NSDate {
                        namesWithDates[name] = date
                    }
                }
            }
        } catch _ {
            // handle your errors here
        }
    }
    return namesWithDates
}
您实际上不需要将结果转换到
name date
字典中,还可以将
sortDescriptors
添加到
request
中,以便根据需要对列表进行排序。但这取决于你