问题场景

这个问题遇到是偶然的,正常来说是不会出现的。但是有时候在一些极端操作情况下,还是出现了。

现在我说明下这个场景。页面上是一个tableview,那对应的有一个dataSource,页面顶部有两个“进行中”“已结束”切换按钮。用户通过切换这两个按钮来拉取不同的数据,但是呢,数据源是同一个。对应的网络请求是一样的,只不过是里面请求参数的status一个是1,一个是2。看下这个页面的网络数据回调处理方式:


if(!self.dataSource) {
self.dataSource = responseObj;
} else {
[self.dataSource.orderList addObjectsFromArray:responseObj.orderList];
} [tableView reload];

这个页面的dataSource真实的类型就是网络请求返回的实体responseObj的类型。tableView的真实数据源就是里面的orderList。上面的代码意思很简单,就是如果dataSource为空说明是第一次加载数据,直接进行赋值。如果不为空,说明是上拉加载更多,因此,只要向orderList数组中添加新的数据,然后reload。这样就完成了tableView的数据源更新。

下面再看下如何发请求的:

//获取进行中的订单
- (void)didGetOngoingOrderButtonClicked:(id)sender
{
self.dataSource = nil;
self.request.status = "1";
[request startWithDelegate:self];
} //获取已经结束的订单
- (void)didGetEndOrderButtonClicked:(id)sender
{
self.dataSource = nil;
self.request.status = "2";
[request startWithDelegate:self];
}

逻辑上都是对的,如果切换先将之前的数据源置为nil,然后重新去拉取切换的状态数据。但是,我用鼠标来回疯狂的切换的时候,发现进行中的数据源里面竟然混杂着已经结束的数据源。一开始找了半天都没发现是什么问题,只知道数据源每次请求之前都置为nil的。怎么可能会出现数据源混乱的问题呢。在仔细看界面显示的数据,都是一段进行中的,一段已经结束的。由此可以确定,我们在网络返回数据处理那边在判断nil的情况时,出现了数据混乱的问题。不过,我们可能会想到,在发起请求的时候,我们会弹出指示器,然后阻止用户继续操作。这样基本都能解决这些问题。但是如果我们的程序是跑在了性能比较差的iphone4上时,就有可能会出现,你指示器还没出现,但是用户以为点了没有反应,于是又疯狂的点了几次,这样就会发出了好几次同样的请求。在网络底层那边,我们可能会过滤掉相同的请求,来避免此问题。对于这样公用一个数据源的情况,而且要处理两个不同的切换状态,如果控制不当,就有可能出现这个问题。

看看解决的办法,只是在请求之前先取消发出去的请求,来保证只允许处理一个转态返回数据:

//获取进行中的订单
- (void)didGetOngoingOrderButtonClicked:(id)sender
{
[self.request cancel];
self.dataSource = nil;
self.request.status = "1";
[request startWithDelegate:self];
} //获取已经结束的订单
- (void)didGetEndOrderButtonClicked:(id)sender
{
[self.request cancel];
self.dataSource = nil;
self.request.status = "2";
[request startWithDelegate:self];
}

这个问题出现的重点是极端情况下发出了两个不同状态的请求,在回调的时候,由于第一个回来的是nil,所以直接赋值。但是第二个回来的时候,因为不是nil,所以直接往数组里面添加数据,导致了数据源混乱的问题。虽然出现情况很特殊,但是也应该引起我们的重视。

iOS 数据源切换混乱问题的更多相关文章

  1. Spring动态切换多数据源事务开启后,动态数据源切换失效解决方案

    关于某操作中开启事务后,动态切换数据源机制失效的问题,暂时想到一个取巧的方法,在Spring声明式事务配置中,可对不改变数据库数据的方法采用不支持事务的配置,如下: 对单纯查询数据的操作设置为不支持事 ...

  2. AbstractRoutingDataSource -- Spring提供的轻量级数据源切换方式

    AbstractRoutingDataSource 只支持单库事务,也就是说切换数据源要在开启事务之前执行. spring DataSourceTransactionManager进行事务管理,开启事 ...

  3. spring mvc+mybatis+多数据源切换

    spring mvc+mybatis+多数据源切换,选取oracle,mysql作为例子切换数据源.oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换. web. ...

  4. spring+mybatis多数据源切换

    在实际的公司项目中,很可能会遇到一个问题就是,一个java项目,但是项目中涉及两个数据库,这两个数据库还在不同IP的机子上. 遇到这种情况的时候,我们有两个选择 1.不走spring的aop方式,直接 ...

  5. Spring(AbstractRoutingDataSource)实现动态数据源切换--转载

    原始出处:http://linhongyu.blog.51cto.com/6373370/1615895 一.前言 近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目 ...

  6. dubbo服务+Spring事务+AOP动态数据源切换 出错

    1:问题描述,以及分析 项目用了spring数据源动态切换,服务用的是dubbo.在运行一段时间后程序异常,更新操作没有切换到主库上. 这个问题在先调用读操作后再调用写操作会出现. 经日志分析原因: ...

  7. 【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换

    最近因为项目需要在做两个项目间数据同步的需求,具体是项目1的数据通过消息队列同步到项目2中,因为这个更新操作还涉及到更新多个库的数据,所以就需要多数据源切换的操作.下面就讲讲在Spring中如何进行数 ...

  8. springMVC+Mybatis(使用AbstractRoutingDataSource实现多数据源切换时)事务管理未生效的解决办法

    业务场景: A.B两个单位,系统部署同一套代码: A.B两系统能相互访问: 要求将数据从A系统同步到B系统,再将反馈信息回发给A: 实际开发情况: 因为系统比较小,最开始设计架构的时候没有考虑到消息互 ...

  9. Java注解--实现动态数据源切换

    当一个项目中有多个数据源(也可以是主从库)的时候,我们可以利用注解在mapper接口上标注数据源,从而来实现多个数据源在运行时的动态切换. 实现原理 在Spring 2.0.1中引入了Abstract ...

随机推荐

  1. 004-行为型-06-命令模式(Command)

    一.概述 是一种数据驱动的设计模式 请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 将请求封装成对象,以便使用不同的请 ...

  2. mysql 1045

    1.sudo gedit /etc/my.cnf 2.加入 skip-grant-tables 3.直接登录,输密码时回车 mysql -u root -p 4.修改密码 use mysql; upd ...

  3. mat文件读写

    一起来学演化计算-mat文件读写 觉得有用的话,欢迎一起讨论相互学习~Follow Me Matlab读取和保存mat文件数据 在matlab命令行中输入save 变量名a,将a变量保存在新生成的a. ...

  4. pipline中替换tag变量

    实验架构: 192.168.0.96 gitlab 192.168.0.97 jenkins 192.168.0.98 harbor.docker集群 说明:下面代码编译镜像那一步的代码必须靠左,目的 ...

  5. 【minikube & helm】

    minikube是用来快速搭建一个单机kubernetes集群的工具. https://www.cnblogs.com/liyuanhong/p/10143157.html helm是kubernet ...

  6. JavaScript:学习笔记(10)——XMLHttpRequest对象

    JavaScript:学习笔记(10)——XMLHttpRequest对象 XHR对象 使用XMLHttpRequest (XHR)对象可以与服务器交互.您可以从URL获取数据,而无需让整个的页面刷新 ...

  7. 高级UI-自定义动画框架

    有的时候会需要做一些自定义的动画效果,在会反复用到的动画效果可以考虑做成动画框架,方便使用,做成框架的话就需要考虑很多的问题,最典型的问题就是属性和方法必须要是可配置的,这里就来聊一聊自定义动画框架的 ...

  8. 超类Object

    Object:是类层次结构中的跟类,所有类都直接货间接继承自该类 如果一个方法的形参是Object,那么这里我们就可以传递它的任意的子类对象,相当于传任何数据类型都可以 toString()——返回地 ...

  9. [转帖]新iPhone的黑科技:UWB技术揭秘

    新iPhone的黑科技:UWB技术揭秘 http://blog.nsfocus.net/iphone-black-technology-uwb-technology-revealed/    阅读:  ...

  10. linux查看文件前几行和后几行的命令

        可以使用head(查看前几行).tail(查看末尾几行)两个命令.例如:查看/etc/profile的前10行内容,应该是:# head -n 10 /etc/profile查看/etc/pr ...