对于我的核心数据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
属性。
有更简单的方法吗?
答案 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
,它就不会阻止点击变更事件,但这确实意味着您不必手动触发它们。