ios 一个界面多个请求处理

本文介绍了一种使用数组存储请求名称并通过performSelector实现按顺序串行请求的方法。此方法避免了多线程及请求间的相互依赖所带来的复杂性,并讨论了performSelector的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值