iOS数据访问层和数据访问层的神奇记录处理

iOS数据访问层和数据访问层的神奇记录处理,ios,core-data,data-access-layer,magicalrecord,afnetworking-2,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

我正试图用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
    }
}

首先,您没有使用正确的Objective C约定。init方法从来都不是类方法。我建议你读一些书。其次,我强烈建议不要从初始化方法触发网络请求

第三,实际的问题是核心数据对象是否适合放置这种类型的网络/数据模型转换代码。通常,数据对象应该具有对这些对象执行操作的方法。它们是否启动网络请求、处理数据或其他任何内容都应该是次要的问题,而绝对不是您向这些数据对象的消费者公开的内容


在触发网络请求的情况下,或者更一般地说,在异步场景中,您应该设计接口,以便在操作完成后调用完成信号。在ObjC中,您可以使用一个完成块或一个代表来完成此任务。

非常感谢,我做了更多的研究,并找到了我需要做的事情。