AFNetworking使用實(shí)例

寫在前面

分享此實(shí)例,希望能幫到一些像我一樣的初學(xué)者。
代碼有哪些不好的地方,還望各位讀者多多指教。
源碼請(qǐng)戳這

頭文件 JDNetworkRequest.h

#import <Foundation/Foundation.h>

@protocol JDNetworkRequestDatasource <NSObject>

- (NSString *)jdNetworkRequestBaseURLString; //用于初始化的網(wǎng)址

@end

//網(wǎng)絡(luò)請(qǐng)求類型
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;

/**
 *  發(fā)送網(wǎng)絡(luò)請(qǐng)求
 *
 *  @param urlString   網(wǎng)址字符串
 *  @param parameters  參數(shù)
 *  @param type        請(qǐng)求類型
 *  @param resultBlock 返回結(jié)果:responseObject,error
 */
- (void)jd_requestWithURLString:(NSString *)urlString
                     parameters:(NSDictionary *)parameters
                           type:(JDNetworkRequestType)type
                    resultBlock:(JDNetworkRequestResultBlock)resultBlock;
@end

實(shí)現(xiàn)文件 JDNetworkRequest.m

類擴(kuò)展部分

@interface JDNetworkRequest ()
@property (nonatomic, strong) AFHTTPSessionManager *manager;
@property (nonatomic, assign, getter=isConnected) BOOL connected;     /**<網(wǎng)絡(luò)是否連接*/
@end

介紹網(wǎng)絡(luò)請(qǐng)求方法之前,先介紹幾個(gè)會(huì)用到的方法

  • 判斷網(wǎng)絡(luò)是否連接的方法
- (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;
     }
    
  • 統(tǒng)一處理返回參數(shù)的方法

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

網(wǎng)絡(luò)請(qǐng)求方法的具體實(shí)現(xiàn)如下:

@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:@"沒有網(wǎng)絡(luò),建議在手機(jī)設(shè)置中打開網(wǎng)絡(luò)"
                                                          delegate:self
                                                 cancelButtonTitle:nil
                                                 otherButtonTitles:@"退出", nil];
        [alertView show];
        return;
    }
    if (![self.datasource respondsToSelector:@selector(jdNetworkRequestBaseURLString)]) {   //未實(shí)現(xiàn)datasource
        JDLog(@"error:未實(shí)現(xiàn)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. 實(shí)現(xiàn)JDNetworkRequestDatasource
    #pragma mark - JDNetworkRequestDatasource

     - (NSString *)jdNetworkRequestBaseURLString {
         //TODO: 網(wǎng)址是無效的,請(qǐng)自行更換
         return @"http://www.example.com";
     }
    
  2. 調(diào)用網(wǎng)絡(luò)請(qǐng)求方法
    JDNetworkRequest *networkRequest = [[JDNetworkRequest alloc]init];
    networkRequest.datasource = self;
    //TODO: 以下網(wǎng)址及參數(shù)是無效的,請(qǐng)自行更換
    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);
    }];

寫在最后

歡迎各位讀者指教不足之處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容