我正在寻找一些有效(或至少不那么复杂)的方法来确定和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
}
}
我是否以正确的方式完成工作?有没有其他方法可以这样做?
答案 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;
}
UITableView
,使用allPeople
作为其数据源。如果您有任何疑问,请与我联系!