ios 一个界面多个请求处理

来源:互联网 发布:塞曼效应实验报告数据 编辑:程序博客网 时间:2024/06/11 21:57

1.多线程并不好控制,也不会带来提升太多时间。请求直接需要相互依赖的更不好控制。特别是出错了不好找。
2.采用了最普通的数组请求的方式。

控制数组

@property (nonatomic, strong) NSMutableArray *getDateArray;                  //初始化模型

初始化

    self.getDateArray = [NSMutableArray arrayWithArray: @[@"getRouterInfosocketReq",@"getNetworkSettingReq",                                                          @"wifiSetG5G2NameAndSegment",@"getAutoUpdateReq"]];

单个请求 注意方法名一定要一致。。。只写两个

- (void)getRouterInfosocketReq{    [req sendSuccess:^(id response) {        [self requestSuccess:response andFunction:@"getRouterInfosocketReq"];    } failure:^(NSError *error) {        [self routerInfRequestFailure:error];    }];}- (void)getNetworkSettingReq{    [req sendSuccess:^(id response) {        [self requestSuccess:response andFunction:@"getNetworkSettingReq"];    } failure:^(NSError *error) {        [self routerInfRequestFailure:error];    }];}

最关键代码—
就是通过不断调用getData并获取数组第一项然后调用performSelector方法

- (void)getData{    if (self.getDateArray.count>0) {        NSString *getData = self.getDateArray.firstObject;#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-performSelector-leaks"        [self performSelector:NSSelectorFromString(getData) withObject:nil];#pragma clang diagnostic pop    }else {        [self refreshUI];    }}
- (void)requestSuccess:(id)response andFunction:(NSString *)functionName{    if ([functionName isEqualToString:@"getRouterInfosocketReq"]) {        [self.getDateArray removeObject:@"getRouterInfosocketReq"];        //删除掉已请求部分        if (!self.firstInitModel.autoUpdate) {            [self.getDateArray removeObject:@"getAutoUpdateReq"]; //删除掉依赖不需要的请求        }    } [self getData];//继续调用

NSSelectorFromString(getData)

这个方法是解决问题的关键。数组只能存储对象,不能存储SEL方法,想要调用方法只能使用performSelector
而NSSelectorFromString(getData) 能够将字符串转成SEL方法
,这种方式不仅仅可以放在请求中,同样可以放在整个页面的方法顺序调用中,一样好用,当一个请求还在进行中,用户进行了刷新操作,只要把数组清空,再次重新初始化,就可以再次重头请求了,非常方便,避免了请求的相互依赖,

#

阅读心得文章中提到了performSelector这个方法的缺点。
1.容易引起内存泄露,ARC不知道方法是否能执行,所以不会进行内存管理。
2.只能传递对象,如果为其他类型必须转为对象。在32位和64位机器中存在问题。
3.使用afterDelay 不好。不如用多线程的等待函数。

#

后续会尝试将这个 变更为GCD

0 0
原创粉丝点击