ios 一个界面多个请求处理

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为你写一个简单的物联网设备界面uniapp,它可以帮助用户快速、轻松地控制物联网设备。它将拥有一个友好的用户界面,可以让用户轻松地控制物联网设备。此外,它还可以提供及时的警报服务,让用户更好地管理和监控物联网设备。 ### 回答2: 物联网设备界面是一种通过智能设备连接互联网并实现远程控制与监控的界面。为了开发这样的界面,可以使用Uniapp框架来实现跨平台应用。 Uniapp是一款由腾讯团队开发的基于Vue.js的框架,它使用了HTML、CSS和JavaScript来构建应用程序。Uniapp具有强大的跨平台特性,可以在浏览器、iOS和Android等多个平台上运行。 为了编写物联网设备界面,首先需要确定界面的设计和功能要求。可以使用HTML和CSS来创建界面的布局和样式。使用Uniapp的Vue.js框架可以方便地管理界面的数据和状态。 在界面布局中,可以使用不同的组件来展示设备的状态和控制选项。例如,可以使用按钮和滑动条来控制设备的开关和亮度等。同时,可以使用图表或实时数据展示来监控设备的状态和数据变化。 在JavaScript部分,可以使用Uniapp提供的API来实现与设备的通讯和数据传输。可以通过网络请求或WebSocket等方式与设备进行通信,并将设备的响应数据展示在界面上。 另外,Uniapp还支持使用第三方插件和SDK来访问特定设备的功能和接口。比如,可以使用蓝牙插件来连接蓝牙设备,或者使用摄像头插件来实现设备的实时监控。 总的来说,编写物联网设备界面需要使用Uniapp框架来创建跨平台应用,并结合HTML、CSS和JavaScript来实现界面的设计、数据管理和设备通讯。使用Uniapp的特性和插件可以提高开发效率和功能扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值