Cocoa,使用集合运算符和多对多关系属性进行绑定

Posted

技术标签:

【中文标题】Cocoa,使用集合运算符和多对多关系属性进行绑定【英文标题】:Cocoa, binding using Collection Operators and To-Many relationship properties 【发布时间】:2012-02-29 14:54:36 【问题描述】:

已经做了相当多的谷歌并在这里查看我相信以下无法完成。我对为什么它不能完成以及人们最好的解决方法很感兴趣,我在下面提供了我的。

我使用简单的部门 > 员工模型,既有名称属性,员工实体也有 timeWorked 属性。

问题

我想绑定一个表格,其中第一列显示部门名称,第二列显示部门。@sum.employees.timeWorked。尝试这样做会导致错误:

[<_NSFaultingMutableSet 0x1d5e50> addObserver:forKeyPath:options:context:] is not supported. Key path: timeWorked
Cannot remove an observer <NSTableBinder 0x1a9280> for the key path "employees.timeWorked" from <Depatement 0x1faf40> because it is not registered as an observer.

但是绑定到 department.employees.@count 确实有效(但我想要更多!)。

其他讨论

这里有另一个主题相同的问题:nstablecolumn-binding-using-collection-operators-like-sum

还有一个:cocoa-bindings-binding-to-the-many-end-of-a-to-many-relationship

我的解决方法

我对这个问题的解决方案是为执行求和的部门实体创建一个属性:

-(NSNumber *)departmentHours   
    return [self valueForKeyPath:@"employees.@sum.timeWorked"]; 

然后简单地绑定到它。

当我想要对数据进行某种排序/聚合时,添加这些属性只需要多一点代码,但我确实觉得能够绑定到会更优雅 部门。@sum.employees.timeWorked。

有什么想法吗??它不起作用的原因是什么?更好的解决方法?

大家干杯

【问题讨论】:

是否需要用上述方法创建属性或类别。 不必是属性并保存在持久存储中。你可以让它成为部门类的@property。但是,更改任何员工的工作时间不一定会导致重新计算部门工作时间。除非员工的 setTimeWorked 更改了 keyPathsForValuesAffectingDepartmentHours 中的 keyPath 【参考方案1】:

你写的是绑定到department.@sum.employees.timeWorked - 但是,我认为你应该绑定到department.employees.@sum.timeWorked

【讨论】:

以上是关于Cocoa,使用集合运算符和多对多关系属性进行绑定的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate映射关系:一对一对多和多对多

Laravel:具有 whereHas 和多对多关系的全局范围

Typegoose 模型和多对多关系

QueryDSL 和多对多关系

在一对多和多对多中使用ORM

Cocoa-Touch – 更新多对多关系的核心数据