解决iOS因为网络卡顿点击button或者cell多次push的
2017-06-08 本文已影响767人
Link913
需求
公司的内网测试环境因为网络做过了限制,比较卡,所以测试连续点击button
或者cell
时可能会多次push
控制器.如何在代码改动范围最小的范围内来解决这个问题呢?
方法一(不推荐)
使用分类+运行时
来替换Button
的点击方法,可以设置一个时间间隔
,点击过后开启一个计时器,并关闭按钮的enable
属性,计时完成后再打开enable
.至于cell
暂时没有什么好点子.
优点:
- 改动比较小
缺点:
- 首先他要启动不少定时器
- 如果点击完成后,快速返回则不能再次点击!必须等计时器执行完毕
方法二(能解决问题,但不优雅)
一般我们的网络请求框架都会封装
两到三层AFN
,通过大量的block进行嵌套来完成一系列的请求
工作.所以我们可以设置一个全局id
变量,用来记录当前点击的button
和cell
,在最底层的网络请求开始时将这个按钮/cell的enable
关闭,成功后再次打开.
优点:
- 能解决问题
缺点:
- 记录cell点击,改动也不小
- 并发的问题
- 项目架构可能也有不适用的地方
方法三(推荐)
我们可以控制UINavigationController
中的push
方法,代码很简单,只需要判断当前的控制器和推入的控制器是否是相同的
一个class
就好了.但有一个缺点,若本来就想push
一个相同的控制器就很尴尬了.代码如下:
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
//cell因为网络请求延迟而多次push同一页面
if (![[super topViewController] isKindOfClass:[viewController class]]) { // 如果和上一个控制器一样,隔绝此操作
[super pushViewController:viewController animated:animated];
}
}
方法四(强烈推荐)
链接,这位前辈的方式很巧妙,也解决了我上面的缺点
.
override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) {
if let navigationController = navigationController {
guard navigationController.topViewController == self else {
return
}
}
super.performSegueWithIdentifier(identifier, sender: sender)
}