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