iOS 数据源切换混乱问题

问题场景

这个问题遇到是偶然的,正常来讲是不会出现的。可是有时候在一些极端操做状况下,仍是出现了。数组

如今我说明下这个场景。页面上是一个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的数据源更新。iphone

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

//获取进行中的订单
- (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上时,就有可能会出现,你指示器还没出现,可是用户觉得点了没有反应,因而又疯狂的点了几回,这样就会发出了好几回一样的请求。在网络底层那边,咱们可能会过滤掉相同的请求,来避免此问题。对于这样公用一个数据源的状况,并且要处理两个不一样的切换状态,若是控制不当,就有可能出现这个问题。code

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

//获取进行中的订单
- (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,因此直接往数组里面添加数据,致使了数据源混乱的问题。虽然出现状况很特殊,可是也应该引发咱们的重视。it

相关文章
相关标签/搜索