【问题标题】:Why is [NSSet allObjects] not returning an array of objects in the set为什么 [NSSet allObjects] 不返回集合中的对象数组
【发布时间】:2016-02-26 00:46:26
【问题描述】:

我正在关注[NSManagedObject valueForKeyPath:...],然后检查该查询返回的结果以查看它是单个 NSManagedObject 还是托管对象的 NSSet。如果它是一个 NSSet,我正在尝试使用 [NSSet allObjects] 将它转移到一个 NSArray

它没有按预期返回 NSSet 成员的 NSArray。

guids = [结果 allObjects]

result 实际上是一个 NSSet,但它给了我一个包含 NSSet 的数组。

当我询问数组中有多少对象时,我得到的答案是“1”...

[guids count] // 返回 1

    NSArray *guids;

    id result = [someNSManagedObject valueForKeyPath:kvcPath];

    if ([result isKindOfClass:[NSSet class]])
    {
        guids = [result allObjects];
    }

即使用枚举器和 NSMutableArray 替换 guids = [result allObjects] 也不起作用...

    if ([result isKindOfClass:[NSSet class]])
    {
        NSEnumerator *setEnumerator = [result objectEnumerator];
        NSString *value;

        while (value = [setEnumerator nextObject]) {
            [guids addObject:value];
        }
    }

看下面的图片(搞笑),枚举器应该查看集合中的单个值,但它却将整个集合视为值。

【问题讨论】:

  • 将物品放入套装的代码是什么?
  • 我正在关注一个核心数据关系,如你所知,它要么给你一个 NSManagedObject,要么给你一个 NSManagedObject 的 NSSet,这取决于它在关系中找到的项目数。
  • 这听起来更像是一个咆哮而不是一个问题,这里真的没有任何东西可以帮助您。只是陈述事实。显示代码。例如,什么是 rpInfo?等等……
  • rpInfo 是一个 NSManagedObject
  • 看起来您有一个集合,其中包含另一个包含字符串的集合。

标签: objective-c nsarray nsset


【解决方案1】:

感谢上述 cmets 中的 rmaddy,事实证明这是 NSSet 中的 NSSet。

对比这两条路径来进行解释

someParentManObj.someRelatedChildManObj

someParentManObj.someRelatedChildManObj.someFieldOnChildManObj

显然,如果您只遵循 NSManagedObject 路径来建立关系,而不是进一步,例如字段,那么您将返回... (1) 关系另一端的单个 NSManagedObject,或 (2) 关系另一端的 NSManagedObjects 的 NSSet。

但是,如果您调整路径以使其以 NSManagedObject 上的字段名称结尾,您将不会获得值的 NSSet,而是会获得包装在 NSSet 中的 NSSet。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2012-10-09
    • 2020-01-05
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多