在我所有的iOS应用程序中,我都使用这种方法来遵循MVC模式。我希望确保我的实现是正确的,并且遵守最佳实践和MVC设计模式:
AFNetworking的单例作为网络调用的API:
MyAPI.h:
那么我的实现是否尊重MVC并遵循最佳实践,如果不是,我该如何改进?
AFNetworking的单例作为网络调用的API:
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;
}
使用单例模式获取用户数据的用户模型(这种实现好吗?):
User.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
User.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);
}];
}
[.....]
LoginController.m :
-(void)loginButtonAction:(UIButton *)sender
{
[......]
[ User loginWith:text andPassword:text complete:^(id result, NSError *error)
{
if (result)
{
[APPDELEGATE start];
}
else
{
// ERROR
}
}];
}
那么我的实现是否尊重MVC并遵循最佳实践,如果不是,我该如何改进?
responseObject
为nil
,那么if([responseObject objectForKey:@"id"])
将会评估为NO
,所以如果我正确理解了你的担忧,就不会崩溃。此外,在开发过程中检查数据类型是您可能会做的事情,但在API建立后的生产环境中不需要这样做:在我看来,这太过于防御性编码了。 - Sash Zatsblock != nil
(可以缩写为if (block)
),并且只有在确定有有效指针后才调用它。 - Sash Zatsnil
情况外,我没有看到任何可疑的东西,我可能会添加一个手动创建的NSError
(例如,响应格式错误...)。 - Sash Zats