iOS数据访问层和魔法记录处理数据访问层

时间:2014-03-23 16:20:45

标签: ios core-data data-access-layer magicalrecord afnetworking-2

我试图围绕CoreData,并遇到了MagicalRecord。

我最近一直在搞乱objc / ios开发。我习惯于拥有一个处理模型获取/创建的服务层。我想弄清楚ios中最好的方法是什么。

我是否在模型中处理我的数据访问层,以获取用户或者是否应该从控制器完成此逻辑?

// User.h
+ (User *)initWithUserId:(NSString *)userId; // AFNetworking fetches user and saves to core data

// Account.h
+ (Account *)initWithUsername:(NSString *)username andPassword:(NSString *)password

// Account.m
+ (Account *)initWithUsername:(NSString *)username andPassword:(NSString *)password
{
    __block Account *account;

    [[HTTPSessionManager sharedClient] POST:@"/authenticate" parameters:@{@"email":username,@"pw":password} success:^(NSURLSessionDataTask *task, id responseObject) {

        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)task.response;
        NSString *authToken = [[httpResponse allHeaderFields] objectForKey:@"Auth-Token"];

        account.password = password;
        account.token = authToken;
        account.user = [User initWithUserId:responseObject['_id']];

       [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];


    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

    return account;
}

// LoginViewController.m

- (void)signIn
{
    NSString *username = self.usernameTextField.text;
    NSString *password = self.passwordTextField.text;

    Account *account = [Account initWithUsername:username andPassword:password];
    if (account objectID) {
        // sign in successful
    }
}

1 个答案:

答案 0 :(得分:1)

首先,您没有使用正确的Objective C约定。 init 方法永远不是类方法。我建议你阅读一些Apple Documentation regarding object initializers。其次,我强烈建议反对从初始化方法触发网络请求。

第三,实际问题是核心数据对象是否适合放置此类网络/数据模型转换代码。通常,数据对象应具有对这些对象执行操作的方法。无论是发布网络请求,过程数据还是其他任何内容都应该是次要问题,绝对不是您向这些数据对象的使用者公开的内容。

如果触发了网络请求,或者更常见的是异步场景,则应设计界面,以便在操作完成后调用完成信号。在ObjC中,您可以使用完成块或代表。