gpt4 book ai didi

iOS 数据访问层和数据访问层的 Magical Record 处理

转载 作者:行者123 更新时间:2023-11-29 03:07:33 26 4
gpt4 key购买 nike

我正在努力研究 CoreData,然后遇到了 MagicalRecord。

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

我是在获取用户的模型中处理我的数据访问层,还是应该从 Controller 完成此逻辑?

// 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 方法永远不是类方法。我建议您阅读一些 Apple Documentation regarding object initializers .其次,我强烈建议反对从初始化方法中触发网络请求。

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

在触发网络请求的情况下,或者更一般地说,在异步情况下,您应该设计接口(interface),以便在操作完成后调用完成信号。在 ObjC 中,您可以为此使用完成 block 或委托(delegate)。

关于iOS 数据访问层和数据访问层的 Magical Record 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22593520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com