我正在开发一个用于Web服务的iOS客户端,我从Json API获取数据,我将其解析并保存到CoreData中。我有一些重复,主要是我如何解析和保存对象。一个例子是创建用户的方法,这种方法在两个控制器中几乎完全相同(将来可能更多):
- (User *)createUserFromDict:(NSDictionary *)dictionary
{
User *user;
NSNumberFormatter *numberFormatter= [[NSNumberFormatter alloc] init];
NSNumber * userId = [numberFormatter numberFromString:(NSString *)[dictionary valueForKey:@"id"]];
NSEntityDescription *userDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext:[appController managedObjectContext]];
NSEntityDescription *imageDescription = [NSEntityDescription entityForName:@"Image" inManagedObjectContext:[appController managedObjectContext]];
user = [[User alloc] initWithEntity:userDescription insertIntoManagedObjectContext:[appController managedObjectContext]];
user.name = [dictionary valueForKey:@"name"];
[...]
Image *userAvatrar = [[Image alloc] initWithEntity:imageDescription insertIntoManagedObjectContext:[appController managedObjectContext]];
userAvatrar.url = [dictionary valueForKeyPath:@"avatar_image.url"];
[...]
NSError *error;
[[appController managedObjectContext] save:&error];
return user;
}
我不确定这种重复是否是必要的,或者是否有更好的方法。我正在考虑创建一个“cacheManager”控制器类并在这里存储这样的方法,或者将它放在我的模型中。这是最好/最正确的方法吗?
答案 0 :(得分:3)
DRY - 不要重复自己的原则不仅可以节省代码,更重要的是可以在一个地方而不是几个地方进行维护。
单一责任原则规定每个单位(类/方法)应该只做一件事。
因此消除了重复的代码。
类或方法取决于缓存和未来需求的相关程度。如果有意义的话,你可以慢慢使用一个方法然后重构为一个类。
如果使用它的两个控制器是单独的类,似乎新的类可能是继续进行的方式。
如果给出良好的命名约定,这也将使代码更容易理解。
答案 1 :(得分:2)
最好的方法是使它成为User对象的类方法:
+ (User *)insertUserFromDictionary:(NSDictionary *)dictionary inManagedObjectContext: (NSManagedObjectContext*) moc
{
User *user = nil;
NSNumberFormatter *numberFormatter= [[NSNumberFormatter alloc] init];
NSNumber * userId = [numberFormatter numberFromString:(NSString *)[dictionary valueForKey:@"id"]];
NSEntityDescription *userDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext: moc];
NSEntityDescription *imageDescription = [NSEntityDescription entityForName:@"Image" inManagedObjectContext: moc];
user = [[User alloc] initWithEntity:userDescription insertIntoManagedObjectContext:moc];
user.name = [dictionary valueForKey:@"name"];
[...]
Image *userAvatrar = [[Image alloc] initWithEntity:imageDescription insertIntoManagedObjectContext: moc];
userAvatrar.url = [dictionary valueForKeyPath:@"avatar_image.url"];
[...]
NSError *error;
[moc save:&error];
return user;
}
你当然称之为:
User *newUser = [User insertUserFromDictionary: userDictionary inManagedObjectContext: appcontroller.managedObjectContext];
考虑将上下文的保存操作移出此类方法,并在插入用户后“自己”调用它,我在这里没有这样做。