从NSArrays收集数据,具有无法解释的行为

时间:2013-04-16 23:55:35

标签: ios objective-c cocoa

我的Cocoa项目中有一组对象。如果对象具有与传入值匹配的属性,则应将对象保存到新数组,该数组是方法的返回值。这看起来非常简单,但我看到了一些奇怪的行为。这是方法:

- (NSMutableArray*)tagAttributeRectsForID:(NSString*)nodeID
{
    NSMutableArray * resultArray = [NSMutableArray array];
    for (NSDictionary * line in self.lineInfoForTap) {

        NSMutableArray * glyphRects = [line valueForKey:@"GlyphRects"];

        for (NSDictionary * rectDict in glyphRects) {
            if ([rectDict valueForKey:nodeID]) {
                CGRect thisRect = CGRectFromString([rectDict valueForKey:nodeID]);
                if (thisRect.size.width > 0) {
                    [resultArray addObject:NSStringFromCGRect(thisRect)];
                }

            }
        }
        glyphRects = nil;
    }
    return resultArray;
}

根据导致一组匹配的行对象的数量,发生的情况是,我在返回的数组中获得完整结果集的次数。换句话说,我希望样本结果看起来像这样:

2013-04-16 19:38:37.665 Vorpal[18523:c07] (
"{{0, 486.5}, {38.44, 13.5}}",
"{{100, 486.5}, {27.12, 13.5}}",
"{{140, 483.34}, {86.54, 16.66}}",
"{{0, 508.86}, {58.62, 14.14}}"
)

但我得到了这个:

2013-04-16 19:38:37.665 Vorpal[18523:c07] (
"{{0, 486.5}, {38.44, 13.5}}",
"{{100, 486.5}, {27.12, 13.5}}",
"{{140, 483.34}, {86.54, 16.66}}",
"{{0, 508.86}, {58.62, 14.14}}",
"{{0, 486.5}, {38.44, 13.5}}",
"{{100, 486.5}, {27.12, 13.5}}",
"{{140, 483.34}, {86.54, 16.66}}",
"{{0, 508.86}, {58.62, 14.14}}"
)

如果有三行匹配的结果,我会收回三组数据。

我不禁想到我错过了一些关于我编写这种方法的基本方法,但是经过几个小时的盯着它,我已经准备好放弃并问朋友了。你是那个朋友,匿名的SO读者吗?我可以用朋友: - (

1 个答案:

答案 0 :(得分:4)

如果您的结果有重复(它确实如此),那么我们应该推断您的源数据有重复。您可以使用NSSet过滤重复项。

如果您有意,可以大量压缩此代码。然后,您不需要显式创建集合。

首先在NSString上创建一个类别:

@interface NSString (ValidStringRect)
- (BOOL)validRect { return CGRectFromString(self).size.width > 0; }
@end

然后用以下方法替换您的方法:

- (NSMutableArray*)tagAttributeRectsForID:(NSString*)nodeID
{
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"validRect = YES"];
    // I might have the @distinctUnionOfArrays operator at the wrong point in the keypath
    id array = [self valueForKeyPath:[NSString stringWithFormat:@"lineInfoForTap.GlyphRects.@distinctUnionOfArrays.%@", nodeID]];
    return [[array filteredArrayUsingPredicate:pred] mutableCopy];
}

键“@distinctUnionOfArrays”是一个数组运算符,没有它就会有一个数组数组。有关详细信息,请参阅https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html