计算Core Data中的持久属性

时间:2014-03-04 11:24:53

标签: objective-c core-data

我在NSManagedObject类中有属性 firstName lastName 。我需要另一个属性 uppercaseFirstLetter ,这是从这两个属性计算出来的。属性 uppercaseFirstLetter 不能是瞬态的,它将用于sectionNamedKeyPath

[[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest 
                                    managedObjectContext: [DatabaseManager context]
                                      sectionNameKeyPath: @"uppercaseFirstLetter" 
                                               cacheName: nil];   

和排序描述符

NSSortDescriptor *sortLastNameDescriptor = 
[[NSSortDescriptor alloc] initWithKey: @"uppercaseFirstLetter" 
                            ascending: YES 
                             selector: @selector(localizedStandardCompare:)]; 

这是用于计算uppercaseFirstLetter:

的代码
NSString *aString = nil;
NSString *lastName = [self valueForKey:@"firstName"];
NSString *firstName = [self valueForKey:@"lastName"];

if (lastName.length) {
    aString = [lastName uppercaseString];
} else if (firstName.length) {
    aString = [firstName uppercaseString];
} else {
    aString = @"#";
}

NSString *stringToReturn = [aString substringToIndex:1];

我需要如何创建 uppercaseFirstLetter 以及代码中的哪些更改才能达到此结果?

1 个答案:

答案 0 :(得分:1)

您可以使用firstNamelastName的自定义setter方法更新uppercaseFirstLetter属性:

- (void)setFirstName:(NSString *)firstName
{
    [self willChangeValueForKey:@"firstName"];
    [self setPrimitiveValue:firstName forKey:@"firstName"];
    [self updateUppercaseFirstLetter];
    [self didChangeValueForKey:@"firstName"];
}

您还必须为lastName执行此操作。

或者,如果需要,您可以通过KVO观察firstNamelastName的更改,以更新uppercaseFirstLetter。有很多解决方案可以解决这个问题。关键字:“NSManagedObject”“KVO”

最后的解决方案可能是更优雅的方式。