ModelTransformer 的目标是把一个模型,如 API 提供的模型,转换为应用程序使用的 CoreData 模型。为此,转换器需要了解要转换到的实体。因此,这个转换器只能与 NSManagedObjectModel
结合使用。
MTObjectTransformer
和 MTArrayTransformer
是自定义模型转换的基础类。因此,使用这些转换器.application 需要 subclassing 这两个类以提供它们的逻辑。
下面的例子使用日期格式化将所有类型为 NSDateAttributeType
的属性转换为 NSDate
对象,并将名称为 'url' 的属性转换为 NSURL
对象。
@implementation MyObjectTransformer
- (id)transformedValueForAttribute:(NSAttributeDescription *)attributeDescription
ofObject:(id)object
userInfo:(NSDictionary *)userInfo
{
if (attributeDescription.attributeType == NSDateAttributeType) {
NSString *dateString = [object valueForKey:attributeDescription.name];
if (dateString) {
return [[[self class] dateFormatter] dateFromString:dateString];
}
return nil;
} else if ([attributeDescription.name isEqualToString:@"url"]) {
NSString *urlString = [object valueForKey:@"url"];
if (urlString) {
return [NSURL URLWithString:urlString];
}
return nil;
} else {
return [super transformedValueForAttribute:attributeDescription
ofObject:object
userInfo:userInfo];
}
}
@end
通常转换是通过以下方法执行的,这些方法可以在子类中覆盖。如果属性是属性属性,则基类将返回 valueForKey:
的值;如果属性是关系属性,则返回 MTObjectTransformer
或 MTArrayTransformer
的对象,具体取决于基数(一对多或多对多)。
@interface MTObjectTransformer : NSObject
- (id)transformedValueForAttribute:(NSAttributeDescription *)attributeDescription
ofObject:(id)object
userInfo:(NSDictionary *)userInfo;
- (id)transformedValueForRelationship:(NSRelationshipDescription *)relationshipDescription
ofObject:(id)object
userInfo:(NSDictionary *)userInfo
class:(Class)_class;
- (id)transformedValueForRelationship:(NSRelationshipDescription *)relationshipDescription
ofObject:(id)object
userInfo:(NSDictionary *)userInfo;
@end
@interface MTArrayTransformer : NSArray
- (id)transformedObjectAtIndex:(NSUInteger)index
ofArray:(NSArray *)array
userInfo:(NSDictionary *)userInfo;
- (NSUInteger)transformedCountOfArray:(NSArray *)array
userInfo:(NSDictionary *)userInfo;
@end
Tobias Kräntzer, [email protected]
版权所有 (c) 2014, Tobias Kräntzer。保留所有权利。
在满足以下条件的情况下,允许重新分发和使用源代码和二进制形式,是否有修改:
源代码的分发必须保留上述版权声明、本许可协议列表和以下免责声明。
二进制形式的重分发必须复制上述版权声明、本许可协议列表和以下免责声明在文档和/或其他与分发提供的材料中。
未经事先书面许可,不得使用版权持有者的名称或其贡献者的名称作为该软件派生产品的推广或标志。
本软件由版权所有者和贡献者提供“现状”且不做任何明示或暗示的保证,包括但不限于适销性和特定用途适用性的暗示保证。在任何情况下,版权所有者或贡献者均不对因使用本软件而产生的任何直接、间接、附带、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,即使已被告知此类损害的可能性。