4

对于我的 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属性。

有没有更简单的方法?

4

3 回答 3

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
于 2013-08-21T18:33:14.447 回答
2

如果您只需要确保保存的数据被修剪,那么您可以实现willSave并使用changedValues仅检查更改的值。这也将使循环中的操作变得容易,以最大限度地减少代码重复。

于 2013-08-21T15:47:48.687 回答
1

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

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

    return YES;
}

validateSomeProperty:error:Core data 会在保存你的记录之前自动调用,所以这将确保任何被保存的数据都被修剪。如果有人将它从 更改为 ,它不会停止 on-change 事件的触发foo\n\nfoo\n\n但这确实意味着您不必手动触发它们。

于 2013-08-22T07:31:41.183 回答