核心数据:自动修剪字符串属性

时间:2013-08-21 15:32:52

标签: ios objective-c core-data

对于我的核心数据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属性。

有更简单的方法吗?

3 个答案:

答案 0 :(得分:5)

您可以为NSValueTransformer创建自定义NSString,并将所有NSString属性分配给模型编辑器中的新变换器:

@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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您可以在属性验证期间执行此操作:

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

    return YES;
}

Core data will automatically call validateSomeProperty:error: before saving your record,这样可以确保修剪所有保存的数据。如果某人将其从foo更改为\n\nfoo\n\n,它就不会阻止点击变更事件,但这确实意味着您不必手动触发它们。