在CoreData中为NSManagedObject选择唯一标签

时间:2011-07-21 15:00:55

标签: iphone objective-c ipad

我正在寻找一个更好的替代方案来处理这个问题。

在CoreData模型中,我有一个名为Project的NSManagedObject。在它的子类中,我为其label属性覆盖了访问器方法(setter)。在这里,我检查是否已使用相同的标签。如果是,我在标签上添加下划线和数字,例如“MyProject”重命名为“MyProject_1”。当然我还要检查是否找到标签“MyProject”或“MyProject _”+数字。我用正则表达式做到了这一点。

NSString *regexString = [NSString stringWithFormat:@"%@_[0-9]+", value];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(label = %@) OR (label MATCHES %@)", value, regexString];
[request setPredicate:predicate];

然后我检查获取了多少结果,让我们说5,所以我知道下一个结果被称为“MyProject_6”。

它工作正常,但您可能已经注意到此代码存在一些问题:如果我有以下标签会发生什么:

MyProject_1,MyProject_2,MyProject_3

并且用户决定调用项目MyProject_55。 然后我的搜索将检索4个元素,下一个项目将被标记为MyProject_5而不是MyProject_4。更糟糕的是,在某些时候,我最终会得到两个MyProject_55。我知道它不太可能发生,但它可以:)。

任何更好的想法?

这是存取方法

#pragma mark - Setter for label

- (void)setLabel:(NSString *)aLabel
{
    if ([[self primitiveValueForKey:@"label"] isEqualToString:aLabel]) 
    {
        return;
    }

    NSMutableArray *objects = [self fetchObjectsWithValueEqualTo:aLabel];
    NSUInteger objectsCount = [objects count];

    aLabel = objectsCount > 0 ? [NSString stringWithFormat:@"%@_%d",aLabel, objectsCount] : aLabel;

    [self willChangeValueForKey:@"label"];
    [self setPrimitiveValue:aLabel forKey:@"label"];
    [self didChangeValueForKey:@"label"];
}

1 个答案:

答案 0 :(得分:0)

它有点贵,但摆脱这种困境的最简单方法是,一旦你有一个新的标签决定“MyLabel_4”重新检查商店中是否存在该标签。

冲洗并重复,直到您确实拥有独特的标签。核心数据非常有效,因此在用户案例中这不重要。