AFNetworking使用实例

写在前面

分享此实例,希望能帮到一些像我一样的初学者。
代码有哪些不好的地方,还望各位读者多多指教。
源码请戳这

头文件 JDNetworkRequest.h

#import <Foundation/Foundation.h>

@protocol JDNetworkRequestDatasource <NSObject>

- (NSString *)jdNetworkRequestBaseURLString; //用于初始化的网址

@end

//网络请求类型
typedef NS_ENUM(NSUInteger,JDNetworkRequestType) {
    JDNetworkRequestTypePost,
    JDNetworkRequestTypeGet,
    JDNetworkRequestTypeHead,
    JDNetworkRequestTypePut,
    JDNetworkRequestTypeDelete
};

typedef void(^JDNetworkRequestResultBlock)(id responseObject,NSError *error);

@interface JDNetworkRequest : NSObject

@property (nonatomic, weak) id<JDNetworkRequestDatasource> datasource;

/**
 *  发送网络请求
 *
 *  @param urlString   网址字符串
 *  @param parameters  参数
 *  @param type        请求类型
 *  @param resultBlock 返回结果:responseObject,error
 */
- (void)jd_requestWithURLString:(NSString *)urlString
                     parameters:(NSDictionary *)parameters
                           type:(JDNetworkRequestType)type
                    resultBlock:(JDNetworkRequestResultBlock)resultBlock;
@end

实现文件 JDNetworkRequest.m

类扩展部分

@interface JDNetworkRequest ()
@property (nonatomic, strong) AFHTTPSessionManager *manager;
@property (nonatomic, assign, getter=isConnected) BOOL connected;     /**<网络是否连接*/
@end

介绍网络请求方法之前,先介绍几个会用到的方法

  • 判断网络是否连接的方法
- (BOOL)isConnected {
    struct sockaddr zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sa_len = sizeof(zeroAddress);
    zeroAddress.sa_family = AF_INET;

    SCNetworkReachabilityRef defaultRouteReachability =
    SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    BOOL didRetrieveFlags =
    SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);

    if (!didRetrieveFlags) {
        printf("Error. Count not recover network reachability flags\n");
        return NO;
    }
    
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    return (isReachable && !needsConnection) ? YES : NO;
}
  • self.manager懒加载

     - (AFHTTPSessionManager *)manager {
        if (!_manager) {
            NSString *baseUrlString = [self.datasource jdNetworkRequestBaseURLString];
            _manager = [[AFHTTPSessionManager alloc]
                        initWithBaseURL:[NSURL URLWithString:baseUrlString]];
         }
         return _manager;
     }
    
  • 统一处理返回参数的方法

  - (void)handleRequestResultWithDataTask:(NSURLSessionDataTask *)task
                           responseObject:(id)responseObject
                                    error:(NSError *)error
                              resultBlock:(JDNetworkRequestResultBlock)resultBlock {
                                //do something here...
                                JD_EXECUTE_BLOCK(resultBlock,responseObject,error);
                                }

网络请求方法的具体实现如下:

@implementation JDNetworkRequest

- (void)jd_requestWithURLString:(NSString *)urlString
                     parameters:(NSDictionary *)parameters
                           type:(JDNetworkRequestType)type
                    resultBlock:(JDNetworkRequestResultBlock)resultBlock {
    if (!self.isConnected) {
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"温馨提示"
                                                           message:@"没有网络,建议在手机设置中打开网络"
                                                          delegate:self
                                                 cancelButtonTitle:nil
                                                 otherButtonTitles:@"退出", nil];
        [alertView show];
        return;
    }
    if (![self.datasource respondsToSelector:@selector(jdNetworkRequestBaseURLString)]) {   //未实现datasource
        JDLog(@"error:未实现JDNetworkRequestDatasource");
        return;
    }

    NSSet *acceptableContentTypes = [NSSet setWithObjects:@"application/json",
                                     @"text/html",
                                     @"text/json",
                                     @"text/javascript",
                                     @"text/plain", nil];

    self.manager.operationQueue.maxConcurrentOperationCount = 5;
    self.manager.requestSerializer.timeoutInterval = 3;
    self.manager.responseSerializer.acceptableContentTypes = acceptableContentTypes;

    switch (type) {
        case JDNetworkRequestTypePost: {
            [self.manager POST:urlString
                    parameters:parameters
                       success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
                           [self handleRequestResultWithDataTask:task
                                                  responseObject:responseObject
                                                           error:nil
                                                     resultBlock:resultBlock];
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                [self handleRequestResultWithDataTask:task
                                       responseObject:nil
                                                error:error
                                          resultBlock:resultBlock];
            }];
            break;
     }        
        ...

其他JDNetworkRequestType限于篇幅,就不一一列出,
有兴趣的可以看源码

如何使用?

  1. 实现JDNetworkRequestDatasource
    #pragma mark - JDNetworkRequestDatasource

     - (NSString *)jdNetworkRequestBaseURLString {
         //TODO: 网址是无效的,请自行更换
         return @"http://www.example.com";
     }
    
  2. 调用网络请求方法
    JDNetworkRequest *networkRequest = [[JDNetworkRequest alloc]init];
    networkRequest.datasource = self;
    //TODO: 以下网址及参数是无效的,请自行更换
    NSString *urlString = @"http://www.example.com/?_c=thread&_a=threadInfo";
    NSDictionary *parameters = @{ @"msg_id" : @0,
    @"sign" : @"149f7fd34ba2a961ab52ac0225da7f6c",
    @"time" : @"1447414060",
    @"token" : @"FMXa++Q0Lwkue+Mdirr6lw==",
    @"thread_id" : @"198"
    };
    [networkRequest jd_requestWithURLString:urlString
    parameters:parameters
    type:JDNetworkRequestTypePost
    resultBlock:^(id responseObject, NSError *error) {
    NSLog(@"%@",responseObject);
    }];

写在最后

欢迎各位读者指教不足之处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容