Уровень доступа к данным iOS и обработка Magical Record уровня доступа к данным

Я пытаюсь разобраться с 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
    }
}

person slik    schedule 23.03.2014    source источник


Ответы (1)


Во-первых, вы не используете правильные соглашения Objective C. Методы init никогда не являются методами класса. Я предлагаю вам прочитать часть документации Apple относительно объекта инициализаторы. Во-вторых, я настоятельно рекомендую против запускать сетевой запрос из метода инициализации.

И в-третьих, реальный вопрос заключался в том, подходят ли объекты Core Data для размещения такого типа кода преобразования модели сети/данных. В общем, объекты данных должны иметь методы, которые выполняют действия над этими объектами. Запускают ли они сетевой запрос, обрабатывают данные или что-то еще, это должно быть второстепенной задачей, и определенно не тем, что вы предоставляете потребителям этих объектов данных.

В случае, когда запускаются сетевые запросы или, в более общем случае, асинхронные сценарии, вы должны спроектировать свой интерфейс таким образом, чтобы после завершения операции вызывался сигнал завершения. В ObjC для этого можно использовать блок завершения или делегат.

person casademora    schedule 23.03.2014
comment
Большое спасибо, я провел больше исследований и понял, что мне нужно делать. - person slik; 24.03.2014