2013-08-21 149 views
4

对于我的核心数据NSManagedObject,我想确保任何NSString属性只包含已被剪裁空白的字符串。核心数据:自动修剪字符串属性

我知道,我可以通过重写每个setter方法,像这样实现这一点:

- (void)setSomeProperty:(NSString *)someProperty 
{ 
    someProperty = [someProperty stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

    if ((!someProperty && !self.someProperty) || [someProperty isEqualToString:self.someProperty]) return; 

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

然而,这似乎是一个大量的代码有写,尤其是因为我的管理对象是可能具有不少NSString属性。

有没有更简单的方法?

回答

5

你可以创建一个自定义NSValueTransformerNSString,并指定所有NSString性质的新的变压器模型编辑器:

- (BOOL)validateSomeProperty:(id *)inOutValue error:(NSError **)error 
{ 
    if (inOutValue) 
    { 
     NSString *value = *inOutValue; 
     *inOutValue = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    } 

    return YES; 
} 

:属性验证期间

@interface StringTransformer: NSValueTransformer {} 
@end 

@implementation StringTransformer 
+ (Class)transformedValueClass { 
    return [NSString class]; 
} 

+ (BOOL)allowsReverseTransformation { 
    return YES; 
} 

- (id)transformedValue:(id)value { 
    return value; 
} 

- (id)reverseTransformedValue:(id)value { 
    return [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 
@end 
+0

谢谢,我会接受这个答案,因为它具有确保财产价值总是被削减的好处。另一种解决方案也是好的(重写'willSave'),但缺点是在执行保存之前属性值保持不变。 – Francis

2

如果您只需确保保存的数据被修剪,那么您可以实施willSave并使用changedValues仅检查更改的值。这也可以使循环中的代码重复最小化变得容易。

+0

如果您在保存之前需要这样做,最简单的做法可能就是实现用于该特定目的的方法。就像一个'trimStringProperties'方法,它贯穿每个字符串属性并对每个属性进行修剪。 –

1

你可以做到这一点Core data will automatically call validateSomeProperty:error: before saving your record,所以这将确保所有保存的数据都被修剪。如果有人将它从例如foo更改为\n\nfoo\n\n,它不会停止变更事件,但它确实意味着您不必手动解雇它们。

+0

谢谢,这是另一个不错的选择。我不知道在验证过程中你实际上可以更改属性值。 – Francis

+0

如Apple Apple中所述,强烈建议更改验证方法中的值,因为它会使上下文变得肮脏,并且可以再次调用验证,从而导致无限循环。 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/ObjectValidation.html – Lubos