美文网首页iOS学习iOS疑难杂症解决Ios@IONIC
解决iOS因为网络卡顿点击button或者cell多次push的

解决iOS因为网络卡顿点击button或者cell多次push的

作者: Link913 | 来源:发表于2017-06-08 15:57 被阅读767次

    需求

    公司的内网测试环境因为网络做过了限制,比较卡,所以测试连续点击button或者cell时可能会多次push控制器.如何在代码改动范围最小的范围内来解决这个问题呢?

    方法一(不推荐)

    使用分类+运行时来替换Button的点击方法,可以设置一个时间间隔,点击过后开启一个计时器,并关闭按钮的enable属性,计时完成后再打开enable.至于cell暂时没有什么好点子.

    优点:

    • 改动比较小

    缺点:

    • 首先他要启动不少定时器
    • 如果点击完成后,快速返回则不能再次点击!必须等计时器执行完毕

    方法二(能解决问题,但不优雅)

    一般我们的网络请求框架都会封装两到三层AFN,通过大量的block进行嵌套来完成一系列的请求工作.所以我们可以设置一个全局id变量,用来记录当前点击的buttoncell,在最底层的网络请求开始时将这个按钮/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)
    }

    相关文章

      网友评论

      • 英俊神武:方法3挺好的
      • 科24:这个方法4 是不是只适用于storyboard的啊?
      • elite_kyo:方法三,有的时候就需要push到同样class的vc就不可行了
        英俊神武:@gay洛特 怎么优化的呢
        Link913:这个问题已经优化了
        Link913:@elite_kyo 是的,具体情境具体在优化下

      本文标题:解决iOS因为网络卡顿点击button或者cell多次push的

      本文链接:https://www.haomeiwen.com/subject/gtctqxtx.html