【问题标题】:iOS: Is this a reasonable design pattern for a simple iOS App? [closed]iOS:对于一个简单的 iOS 应用来说,这是一个合理的设计模式吗? [关闭]
【发布时间】:2016-04-16 07:28:36
【问题描述】:

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

编辑:为了简化问题,对于向服务器发出 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

【问题讨论】:

  • 您的实际问题是什么?你问的代码呢?
  • 对于向服务器发出 API 请求并在控制器之间传递对象的 App,这是一个好的架构设计吗?
  • 你指的是什么架构设计?
  • 哦,我可能使用了错误的术语。基本上,我使用 MVC 设计模式尝试向 API 发出请求,将请求中的响应对象存储在 User 模型中,并将其发送到我的控制器以在控制器中使用或传递给另一个控制器。
  • 除了你有 3 节课之外,你什么都没告诉我们。我们不知道这些类是如何真正相互关联的,它们是如何创建的。实际上,我们只能说,以会话管理器的方式进行实例化看起来有点奇怪

标签: ios objective-c architecture


【解决方案1】:

在我看来,这种模式有两个方面可以做得更好。

1) 当前用户 由于您的示例是针对当前用户的,因此最好将其放在单例中以便像这样使用(来自 parse.com iOS SDK):

PFUser *currentUser = [PFUser currentUser];
if (currentUser) {
    // do stuff with the user
} else {
    // show the signup or login screen
}

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

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

【讨论】:

    【解决方案2】:

    您不应该将实现放入头文件中(如在 APIClient.h 中)。

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

    【讨论】:

    • 那是一个错字。我在用户和客户端之间混合了 .m 和 .h 。这几乎是我的应用程序。用户登录后,转到另一个视图控制器,用户可以在那里做任何事情。
    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多