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.h 和 Webservice.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.
试图改进我的编码风格,并且想知道处理事情的正确方法是什么。它们应该放在与视图控制器分开的 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.h 和 Webservice.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.