Manager
按照 iOS 项目框架搭建
这篇博客所讲,如果项目需要网络请求,那么就需要
Manager :对 AFNetworking 第三方库的重新封装,把请求数据做一个处理,回传时直接返回对应的 Model
单例
在项目中,需要运用到一些全局变量,例如网络请求得到的数据,这个时候,用单例模式会更便捷。
使用GCD来实现的单例创建:
//Manager.h
+ (instancetype)sharedManager;
//Manager.m
+ (instancetype)sharedManager {
if (!manager) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [Manager new];
});
}
return manager;
}
block回调
把网络请求得到的数据通过block回调传值
/**
* 请求成功回调model数据
*
* @param model model
*/
typedef void(^Handle)(Model *model);
/**
* 请求失败回调错误信息
*
* @param error error错误信息
*/
typedef void(^ErrorHandle)(NSError *error);
网络请求的方法
在Manager.h
中:
/**
* @param success void(^Handle)(Model *model)回调
* @param error void(^ErrorHandle)(NSError *error)回调
*/
- (void)NetworkRequestSuccess:(Handle)succeedBlock error:(ErrorHandle)errorBlock;
在Manager.m
中:
- (void)NetworkRequestSuccess:(DBIHomePageHandle)succeedBlock error:(ErrorHandle)errorBlock {
NSString *hotHomeURLStr = [NSString stringWithFormat:@""];
NSURL *hotHomeURL = [NSURL URLWithString:hotHomeURLStr];
NSURLRequest *hotHomeRequest = [NSURLRequest requestWithURL:hotHomeURL];
NSURLSession *hotHomeSession = [NSURLSession sharedSession];
NSURLSessionDataTask *hotHomeDataTask = [hotHomeSession dataTaskWithRequest:hotHomeRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
DBIHomeModel *hotHomeModel = [[DBIHomeModel alloc] initWithDictionary:resultDic error:&error];
succeedBlock(hotHomeModel);
} else {
errorBlock(error);
}
}];
[hotHomeDataTask resume];
}
在ViewController中使用
按上面的方法,就实现了对网络请求的封装,接下来,就是在ViewController
中运用。
[[Manager sharedManager] NetworkRequestSuccess:^(Model * _Nonnull model) {
//取出传过来的model
} error:^(NSError * _Nonnull error) {
NSLog(@"添加失败");
}];
这里要注意,如果要model
里的数据赋值到视图上,需要返回主线程,也就是如下:
[[Manager sharedManager] NetworkRequestSuccess:^(Model * _Nonnull model) {
//回到主线程
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//对视图的操作
}];
} error:^(NSError * _Nonnull error) {
NSLog(@"添加失败");
}];