NSSortDescriptor对核心数据NSSet对象进行排序的最有效方法

时间:2015-08-07 23:37:56

标签: objective-c core-data nssortdescriptor

所以我有两个核心数据实体 - $table = 'paroles'; $array = array(     'timestamp' => 'VALEUR',     'cle' => 'VALEUR',     'titre' => 'VALEUR',     'paroles' => 'VALEUR',     'titre_trad' => 'VALEUR',     'paroles_trad' => 'VALEUR' );   $values = '';$datas = ''; foreach ($array as $key => $value) {     $values = $values.$key.',';     $datas = $datas.':'.$key.','; } $values = trim($values, ','); $datas = trim($datas, ',');   $requestconstr = 'INSERT INTO '.$table.'('.$values.') VALUES('.$datas.')';   $sth = $this->_db->prepare($requestconstr);   foreach ($array as $key => $value) {     $sth->bindValue(':'.$key, $value); }   if($sth->execute()){     return true; }else return false; // PDOStatement Object ( [queryString] => INSERT INTO paroles(timestamp,cle,titre,paroles,titre_trad,paroles_trad) VALUES(:timestamp,:cle,:titre,:paroles,:titre_trad,:paroles_trad) ) PersonObj。 每个帐户都有多个人。每个人都可以有多个签到,每个签到都有一个时间戳。

CheckInObj

目标是按最近一次检查对所有人进行排序。

PersonObj {
NSSet * checkIns;
}

CheckInObj {
NSDate *timestamp
}

这给了我最近一次办理登机手续。

我现在可以继续排序有一个临时缓存,其中包含我发现的最新签到数据与相应的人,并使用它来对每个人进行排序,最后有一个排序的人员列表。

问题是:

我能以某种方式直接在Person的对象上运行吗?

NSSortDescriptor *nameDescriptor =  [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES];
NSArray *sortedCheckins = [person.checkIns sortedArrayUsingDescriptors:@[nameDescriptor]];
CheckInObject *mostRecentCheckin = [sortedMessages lastObject];

而不是

NSArray *persons = [account.persons allObjects];

我可以构建一个真棒排序描述符,可以为我做这个吗?

我试过了。

 for (Person *person in persons) {
 // find most recent checkin, save temp cache, and resort each time we see a new person in the loop
 }

但它不会比较它,因为它是一个NSSet。

有什么想法?

1 个答案:

答案 0 :(得分:2)

你不能这样做,因为你需要一个聚合。 I. e。如果您想获得第一次或最后一次办理登机手续,则不会向人员报告checkIns.timestamp。 (或平均值或其他。)除此之外-sortDescriptorWithKey需要一个键,而不是一个关键路径。

但是,通常您可以使用Person lastCheckIn的计算属性来解决此问题。这取决于您的具体情况,但您可以在每次更改checkIns数组时(通过单个比较)重新计算该属性,或者根据需要计算它,如果有人试图检索它。

相关问题