我正在寻找一个更好的替代方案来处理这个问题。
在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"];
}
答案 0 :(得分:0)
它有点贵,但摆脱这种困境的最简单方法是,一旦你有一个新的标签决定“MyLabel_4”重新检查商店中是否存在该标签。
冲洗并重复,直到您确实拥有独特的标签。核心数据非常有效,因此在用户案例中这不重要。