2014-03-04 50 views
0

我有屬性名字姓氏在NSManagedObject類中。我需要另一個屬性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以及代碼中的更改應該怎麼做才能達到這個結果?

+0

你看過添加自定義setter方法嗎?或者'NSManagedObject'上的其他方法可以提供什麼幫助? – Wain

+1

相關:http://stackoverflow.com/questions/4874193/core-data-willsave-method – Wain

回答

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」

最後的解決方案可能是更優雅的方式。