IOS开发笔记_AFN中多线程依赖

我们平常在开发当中很可能会遇到同时开启两个网络请求,然后把资源下载下来后进行合并操作,那么在AFN中我们究竟要怎么做呢,当然,以下可能写出一些个人的封装技巧,有兴趣的朋友可以发继续关注我。

#pragma mark -  getter

- (NSOperationQueue *)queue

{

   if (!_queue) {

       _queue = [[NSOperationQueuealloc]init];

    }

   return_queue;

}

这里是我个人对AFN的一个封装类,后面会说到

    NSOperationQueue *mainQueue  = [NSOperationQueuemainQueue];

    //创建网络请求对象

    RequestManager *manager = [RequestManagermanager];


这里同样对请求参数进行了封装,因为在开发过程中,一条请求可能带有许多公共参数,例如UID,DID,APPVersion ,屏幕分辨率,系统操作版本等等参数,如果每次都写一遍岂不是累死人,那么,肯定要用到继承父类了,只有父类都有到这些参数,他的子类也肯定带上了

// 配置请求参数

    FSDynamicParams *dynamicParams = [[FSDynamicParamsalloc]initWithDynamicListParamsWithCityId:@2page:self.page];

// 这里对的AFHTTPRequestOperation请求进行了封装,目的是让代码更加简洁

   AFHTTPRequestOperation *operationList = [manageroperationGETWithParams:dynamicParamsToController:selfSuccessHandle:^(id responseObject) {

       FSLog(@"第一步");

    }];


//配置请求参数

    FSDynamicParams *messageParams = [[FSDynamicParamsalloc]initWithDynamicMessageParams];

 // 这里对的AFHTTPRequestOperation请求进行了封装,目的是让代码更加简洁

   AFHTTPRequestOperation *operationMessage = [manageroperationGETWithParams:messageParamsToController:selfSuccessHandle:^(id responseObject) {

       FSLog(@"第二步");

    }];


    NSBlockOperation *operation3 = [NSBlockOperationblockOperationWithBlock:^{

#warning 这里好奇怪,一定要开一个延时线程才能按正常顺序执行,AFN线程的坑真是多,记录一下

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

            FSLog(@"第三步");

        });

        

    }];

    [operation3addDependency:operationList];

    [operation3addDependency:operationMessage];

    [self.queueaddOperation:operationList];

    [self.queueaddOperation:operationMessage];

    [mainQueueaddOperation:operation3];


这里先说一下为什么第三步结果步要开启一个0.1秒的延时,如果平时演示的话是没必要开的,但是当你在第二步操作里面执行的操作比较多的时候,问题就发生了,线程就会想傻了一样第一步、结果步、第三步执行,当然,我也吃了不少亏,最后研究了一下,只得除了解决方案,还没有只得原来,实在只能说莫名其妙,可能是我目前知识还不够吧,只能Mark一下,以后继续往里面看看了。



说一下封装类的,RequestManager的部分代码

@class BaseParams;

@class FSBaseViewController;

@interface RequestManager :NSObject

- (AFHTTPRequestOperation *)operationGETWithParams:(BaseParams *)params ToController:(UIViewController *)controller SuccessHandle:(void (^)(id responseObject))SuccessHandle;

@end



@implementation RequestManager

+ (instancetype)manager

{

    RequestManager *manager = [[RequestManageralloc]init];

   return manager;

}

// 返回线程操作

- (AFHTTPRequestOperation *)operationGETWithParams:(BaseParams *)params ToController:(UIViewController *)controller SuccessHandle:(void (^)(id responseObject))SuccessHandle{

        //将字典的参数通过AFN的方法转化成http结构的字符串

    NSMutableURLRequest *request = [[AFHTTPRequestSerializerserializer]requestWithMethod:@"GET"URLString:URL_BASEparameters:[paramskeyValue]error:nil];

    

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperationalloc]initWithRequest:request];

    // 设置返回解析器为JSON格式

    operation.responseSerializer = [AFJSONResponseSerializerserializer];

    // 设置线程操作

    [operationsetCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation,id responseObject) {

       if ([responseObject[@"result"]intValue] !=0 ) {

            // 这里是对MBProgressHUD的再封装,自定义了一个类

            [MBProgressHUBhubWithShowText:responseObject[@"message"]toView:controller.view];

           return;

        }

        

       FSLog(@"success:%@",responseObject);

        

        SuccessHandle(responseObject);

    }failure:^(AFHTTPRequestOperation *operation,NSError *error) {

        

        //请求失败后的统一操作,例如告诉用户,请求超时来,,什么什么的,传进来的控制器可以在这里判断,改控制器为哪一个时可以做一些显示不同图片的操作

        //网络请求层,就应该做网络请求的处理嘛,个人是这么认为了,网络请求任何情况都归这个类管

       if ([controllerisKindOfClass:[FSBaseTableViewControllerclass]]) {

            [[(FSBaseTableViewController *)controllertableView].headerendRefreshing];

        }

        [MBProgressHUBhubWithShowStatusCode:NetWorkNotRechabilytoView:controller.view];

        FSLog(@"failure:request --- %@",operation.request);

    }];

    

   return operation;

}



觉得以上代码还对你有用的小伙伴记得支持我喔,好了,Mark做完了,继续敲代码去




你可能感兴趣的:(IOS开发笔记)