AFNetworking 请求是否应该放在与视图控制器分开的 NSObject 中?

Should AFNetworking requests be placed in a NSObject seperate from the view controller?

试图改进我的编码风格,并且想知道处理事情的正确方法是什么。它们应该放在与视图控制器分开的 NSObjects 中吗?是否有任何开源干净的代码示例可供我在线参考?

如果您的应用程序将依赖于构造,那么创建模型始终是个好主意。也就是说,如果您正在构建一个包含完整表格视图或照片的应用程序,那么为照片创建模型是个好主意。


这里有几个例子:

Clean Table View Code - Objc.io

在本教程中,了解填充表格视图的最佳方式,以及模型、单元格和表格视图之间的关系。

A Weather App Case Study

这是为您的表视图构建模型然后填充表视图的端到端演练。

MVC in Objective-C (II): Model

全面了解模型如何适应 MVC 模式。


如果你想从 JSON 响应构造一个对象,你想要这样的东西:

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:&error];

// Sanity check
if ([json isKindOfClass:[NSDictionary class]]){
    NSArray *jsonArray = json[@"items"];

    // Sanity check
    if ([jsonArray isKindOfClass:[NSArray class]]){
        // Here you go through all your items one by one
        for (NSDictionary *dictionary in jsonArray) {
            Model *staff = [[Staff alloc] init];
            model.id = [dictionary objectForKey:@"id"];
            model.name = [dictionary objectForKey:@"name"];
            model.attribute = [dictionary objectForKey:@"attribute"]; 
            // Do this for all your attributes

            [arrayContainingObjects addObject:model];
        }
    }
}

作为一般规则,将访问后端服务器的代码与 UI 组件分开总是一个好主意。一个最好的原因是,通常需要多个 UI 组件访问相同的服务器调用。

就例子而言,可能有数千个。但也许更好的主意是阅读设计模式和应用架构模式等内容。

objc.io 有一些 good articles on these subjects. Here's another on Medium。其他的还有很多,就google搜索一下。

使用通用 NSObject Class 调用 WS 与 AFNetworking 2.0 首先使用任何名称创建 NSObject Class 我正在创建 NSObject Class 使用名称 Webservice.hWebservice.m

Webservice.h

@interface Webservice : NSObject

+ (void)callWSWithUrl:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure;

@end

Webservice.m 你的 nsobject.m 文件看起来像这样。(在 .m 文件中添加两个函数 )

#import "Webservice.h"

#define kDefaultErrorCode 12345

@implementation Webservice

+ (void)callWSWithUrl:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure {

    [self requestWithUrl:stUrl parmeters:parameters success:^(NSDictionary *response) {
        //replace your key according your responce with "success"
        if([[response objectForKey:@"success"] boolValue]) {
            if(success) {
                success(response);
            }
        }
        else {
            //replace your key according your responce with "message"
            NSError *error = [NSError errorWithDomain:@"Error" code:kDefaultErrorCode userInfo:@{NSLocalizedDescriptionKey:[response objectForKey:@"message"]}];
            if(failure) {
                failure(error);
            }
        }
    } failure:^(NSError *error) {
        if(failure) {

            failure(error);
        }
    }];
}

- (void)requestWithUrl:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *))failure {

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];

    //remove comment if you  want to use header
    //[manager.requestSerializer setValue:@"" forHTTPHeaderField:@"Authorization"];

    [manager GET:stUrl parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if([responseObject isKindOfClass:[NSDictionary class]]) {
            if(success) {
                success(responseObject);
            }
        }
        else {
            NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
            if(success) {
                success(response);
            }
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if(failure) {
            failure(error);
        }
    }];}

@end

make sure you have to replace your dictionary key with success and message for handling of responce callback function

像这样使用 从任何 viewcontroller.m 和任何 viewControllers 的任何方法调用此通用方法。暂时我正在使用 viewDidLoad 来调用这个 WS。

- (void)viewDidLoad {
    [super viewDidLoad];

    NSDictionary *dictParam = @{@"parameter1":@"value1",@"parameter1":@"value2"};

    [WebClient requestWithUrlWithResultVerificationWithLoder:@"add your webservice URL here" parmeters:dictParam success:^(NSDictionary *response) {
        //Success
        NSLog(@"responce:%@",response);
        //code here...

    } failure:^(NSError *error) {
        //Error
        NSLog(@"error:%@",error.localizedDescription);
    }];


}

在上面的方法中添加您的参数、值和网络服务URL。你可以很容易地使用这个 NSObjcet Class。欲了解更多详情,请访问 AFNetworking or here.