gpt4 book ai didi

ios - 使用 AFNetworking 在 objective-c 中的模型对象内部获取远程数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:30 25 4
gpt4 key购买 nike

在我所有的 iOS 应用程序中,我都使用这种方法来尊重 MVC,我想确保我的实现是正确的,并且尊重最佳实践和 MVC 设计模式:

作为网络调用 API 的 AFNetworking 单例:

MyAPI.h :

#import "AFHTTPSessionManager.h"
#import "AFNetworking.h"

@interface MyAPI : AFHTTPSessionManager

+(MyAPI *)sharedInstance;

@end

MyAPI.m :

#pragma mark - Singleton

+(MyAPI*)sharedInstance
{
static MyAPI *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[MyAPI alloc] initWithBaseURL:[NSURL URLWithString:kROOT_URL]];
});
return sharedInstance;
}

使用单例来获取用户数据的模型用户(作为实现好吗?):

用户.h

 @interface User : NSObject

@property (strong,nonatomic) NSString *userId;
@property (strong,nonatomic) NSString *email;
@property (strong,nonatomic) NSString *password;


-(id) initWithDictionary: (NSDictionary *) dictionay;

+(BOOL) isConnected;
+(void) disconnect;
+(NSString *) idOfConnectedUser;
+(User *) connectedUser;

+(void) loginWith : (NSString *) email andPassword :(NSString *) password complete:(void(^)(id result, NSError *error))block;
+(void) searchUsersFrom : (NSString *) countryCode withName :(NSString *) name andLevel:(NSString *) levelCode complete: (void(^)(id result, NSError *error)) block;
+(void) signup:(void(^)(id result, NSError *error)) block;
+(void) getUserFriends:(void(^)(id result, NSError *error)) block;

@end

用户.m

  [......]

+(void) loginWith : (NSString *) email andPassword :(NSString *) password complete: (void(^)(id result, NSError *error)) block
{

__block NSString * result ;

NSDictionary *params = @{@"email": email, @"password": password};

[[MyAPI sharedInstance] POST:@"auth/" parameters:params success:^(NSURLSessionDataTask *task, id responseObject)
{

if([responseObject objectForKey:@"id"])
{
[[NSUserDefaults standardUserDefaults] setObject:(NSDictionary*) responseObject forKey:USER_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
result = [responseObject objectForKey:@"id"];
}
else
{
result = nil ;
}


if (block) block(result, nil);

} failure:^(NSURLSessionDataTask *task, NSError *error)
{
if (block) block(nil, error);
}];

}
[.....]

登录 Controller .m :

-(void)loginButtonAction:(UIButton *)sender
{

[......]

[ User loginWith:text andPassword:text complete:^(id result, NSError *error)
{
if (result)
{
[APPDELEGATE start];
}
else
{
// ERROR
}
}];

}

那么我的实现是否尊重 MCV 并遵循最佳实践,如果不尊重我该如何改进?

最佳答案

单例:您可能希望避免使用单例,它将帮助您改进 API 设计并使代码更易于测试。此外,在 User 的情况下,假设您希望支持更改用户(注销/ guest 用户/等)。使用当前方法,您将仅限于发送 NSNotification,因为使用 connectedUser 的每个人都不知道底层引用已更改。

事件记录:您对能够执行网络的模型 User 所做的操作有点类似于 active record approach当您的模型变得更加复杂并且它可以执行的操作数量增加时,它可能无法很好地扩展。考虑将它们分成纯模型和实际执行网络的服务(或您将来需要的任何其他内容)。

模型序列化:考虑将模型和网络响应序列化逻辑封装到一个单独的类中(例如 LoginResponse,除其他外,它指向 User)框架,如 Mantle让它变得更容易。

MVC:根据我在 iOS MVC 中的经验,除了简单的应用程序之外,MVC 可能不是最佳方法。使用 MVC 的趋势是将所有逻辑放入您的 ViewController 中,使其变得非常庞大且难以维护。考虑其他模式,例如 MVVM

总而言之,我知道很难一次学习所有新技术,但您绝对可以从确保每个类执行一件事且仅执行一件事开始:模型不进行联网或持久化到磁盘, API 客户端不会反序列化每个响应或将数据保存到 NSUserDefaults, View Controller 除了监听用户事件(按钮点击等)外什么都不做。如果将新开发人员引入您的代码库,仅此一项就可以使您的代码更易于推理和遵循。

希望对您有所帮助!

关于ios - 使用 AFNetworking 在 objective-c 中的模型对象内部获取远程数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30855777/

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