Я ищу лучшую альтернативу для решения этой проблемы.
В модели CoreData у меня есть NSManagedObject с именем Project.В его подклассе я переопределяю метод доступа (сеттер) для его атрибута метки.Здесь я проверяю, используется ли уже тот же ярлык.Если это так, я добавляю подчеркивание и число к метке, например, «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"];
}