1

我正在开发一个用于 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”控制器类并在此处存储这样的方法,或者将其放入我的模型中。哪种方法是最好/正确的方法?

4

2 回答 2

3

DRY - 不要重复自己的原则不仅可以节省代码,而且更重要的是允许在一个地方而不是多个地方进行维护。

单一职责原则指出每个单元(类/方法)应该只做一件事。

从而消除重复代码。

一个类或方法是否取决于缓存的参与程度和未来的需求。如果有意义的话,你可以慢慢使用一个方法,然后再重构一个类。

如果使用它的两个控制器是单独的类,那么似乎一个新类可能是继续的方式。

鉴于良好的命名约定,这也将使代码更容易遵循。

于 2013-01-01T17:20:14.153 回答
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];

还可以考虑将上下文的保存操作移出此类方法,并在插入用户后“自己”调用它,我在这里没有这样做。

于 2013-01-01T17:19:17.037 回答