检查对象是否在另一个对象的RLMArray属性中

时间:2016-07-28 19:41:20

标签: ios objective-c realm

我正在寻找一些有效(或至少不那么复杂)的方法来确定和Object是否包含在另一个对象的RLMArray属性中。

如果您查看Realm文档,那么有关Inverse relationships的内容,无论如何,我不确定这种模式是否符合我正在寻找的行为。假设我们有一个Person和一个Party类。 Party类具有guests属性:

// Party.h
@interface Party : RLMObject
// ... other property declarations
@property NSString *partyID;
@property RLMArray<Person *><Person> *guests;
@end

在RLMRealm中,我们有一个“宇宙”的人,无论他们是否会帮助任何一方。所以一个人可能在少数几个guests列表中。当我开一个派对时,我想在“宇宙”中显示所有人的列表。而且我们也应该注意到他们是否已经被邀请了。

+---------+---------+
| Invited | Name    |
+---------+---------+
| NO      | Orlando |
| YES     | Kim     |
| NO      | Jorge   |
| NO      | JJ      |
| YES     | Axel    |
+---------+---------+

如果我使用反向关系,那么我将不得不创建一个包含Person

中关系的属性
// Person.h
@interface Person : RLMObject
// ...
@property (readonly) RLMLinkingObjects *assistingTo;
// ...
@end

因此,对于显示人员列表的迭代,我将手动检查该人是否被邀请参加聚会

RLMResults *allPeople = [People allObjects];
Party *thisParty = [Party firstObject];

for (Person *p in allPeople) {
    if ([p.assistingTo indexOfObject:thisParty] > -1) {
        // Show the YES in the table
    } else {
        // Then the person is not attending the party
    }
}

我是否以正确的方式完成工作?有没有其他方法可以这样做?

1 个答案:

答案 0 :(得分:1)

是的!你走在了正确的轨道上! RLMLinkingObjects使用NSPredicate个查询,因此获取参加特定聚会的所有人员列表非常简单:

RLMResults *allPeopleAtTheParty = [Person objectsWhere:@"%@ IN assistingTo", thisParty]; 

这将返回在Person数组属性中具有特定thisParty对象的assistingTo个对象的列表。

如果您想显示每个Person的表格,然后是“参加/不参加”表格。标签,然后它会有点棘手。您显然需要加载所有Person个对象的正确列表,然后将其与过滤后的列表进行比较,以确定哪些是受邀者,哪些不是。

这可能可能在构建UITableViewCell时过于繁重的操作,所以我选择这样做:

1)在Person上创建一个被忽略的属性,跟踪他们是否被邀请:

@interface Person : RLMObject
@property (nonatomic, assign) BOOL invited;
@end

@implementation Person
+ (NSArray *)ignoredProperties
{
   return @[@"invited"];
}
@end

2)查询主列表和排序列表:

RLMResults *allPeople = [Person allObjects];
RLMResults *partyPeople = [Person objectsWhere:@"%@ IN assistingTo", thisParty]; 

3)遍历partyPeople列表中的每个人,并更新invited列表中等效条目中的allPeople属性:

for (Person *person in partyPeople) {
   NSInteger personIndex = [allPeople indexOfObject:person];
   if (personIndex == NSNotFound) {
      continue;
   }

   allPeople[personIndex].invited = YES;
}
  1. 设置UITableView,使用allPeople作为其数据源。
  2. 如果您有任何疑问,请与我联系!