iOS:对于简单的iOS App,这是一个合理的设计模式吗?

时间:2016-04-15 22:48:42

标签: ios objective-c architecture

我正在构建一个向API发出请求的简单应用程序。没有什么太复杂的。我只是想知道这是否是App的良好设计模式。我做的事与我通常做的不同,因为这种设计模式看起来更整洁。我知道对于什么是更好的设计模式有意见,但在可接受和不可接受之间有明确的区分。这就是我想要找到的。

编辑:为简化问题,对于向服务器发出API请求并在控制器之间传递对象的应用程序,这是一个很好的设计模式吗?

查看控制器1.m。

- (IBAction)login:(id)sender {
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
    [params setValue:self.usernameField.text forKey:@"username"];
    [params setValue:self.passwordField.text forKey:@"password"];

    [apiClient loginRequest:params onSuccess:^(User *userInfo) {

        ViewController2 *viewController2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
        viewController2.userInfo = userInfo;
        [self.navigationController pushViewController:viewControllers animated:YES];

    }onFailure:^(NSError* error) {

    }];
}

APIClient.m

- (void)loginRequest:(NSMutableDictionary *)params
           onSuccess:(void(^)(id response))successBlock
           onFailure:(void (^)(NSError *))failureBlock
{
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    [manager POST:[NSString stringWithFormat:@"%@/login", URL] parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        User *user = [[User alloc]init];
        user.name = [responseObject objectForKey:@"name"];
        successBlock(user);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         failureBlock(error);
    }];
}

User.h(这是模型对象)

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (nonatomic,copy) NSString *name;
// There is more properties, but I excluded them from this example

@end

2 个答案:

答案 0 :(得分:1)

在我看来,这种模式中有两个方面可能会更好,而且不费吹灰之力。

1)当前用户 由于您的示例适用于当前用户,因此最好将其设置为单例以便像这样使用(来自parse.com iOS SDK):

iterate (bimap (1+) (1+)) (1, 1)
iterate ((1+) *** (1+)) (1, 1)
map (\x -> (x,x)) $ iterate (1+) 1
join (,) <$> iterate (1+) 1
[(x, x) | x <- [1..]]

实现此操作非常简单,是保存用户而不是将其从vc传递到vc的更好地方。

2)在使用模型的vc之前对模型进行api调用在我看来不是最好的方法。 当api调用正在获取模型时,我会推送具有活动指示符的vc和onViewLoad。

答案 1 :(得分:0)

您不应将实现放入Header-File(如APIClient.h中)。

您的代码看起来不错,但请提供有关应用结构的更多详细信息。