上拉加载更多重复调用

今天帮朋友解决了一个bug.由于是朋友新手的缘故,找了一天也没找到.晚上找到我帮忙.先说下问题:(时间关系,代码就懒得帖出来.全部口述.提醒遇到类似问题的新手朋友注意一下.这是个小问题,很不起眼,但是有时候确实不太好找)
在tableView中,上拉加载cell的时候,松手之后,上拉方法又被调用了N次.界面也会在最后发生跳动
于是我看了朋友的代码,从头到尾仔细核对了各种逻辑,没发现什么问题.大体就是cell用xib做的,AutoLayout布局,tableView自适应高度.(关键代码为estimatedRowHeight = xxx 使用预估行高这种方式)请求完成,数据转模型之后添加到数据源.当数据全部添加到数据后,调用tableView.reloadData刷新界面
综合分析半天,最有可能出现问题的地方在于数据源和界面刷新的地方.我自己又按照他的逻辑,自己定义了数据源,添加数据,并且刷新界面,用swift代码写的,所以实现的方式不太一样,最终通过对比,发现问题所在:
我的方式为数组添加数据源,每添加一条,执行一次tableView.reloadData方法,刷新一次数据源;而朋友的则是在循环中把数据源全部添加完成在执行一次’tableView.reloadData’方法,刷新数据. 在代码中来看的话,就是tableView.reloadData方法在循环添加数据的括号里与括号外边的区别.一行只差,可能对于某些新手来说,找到这个bug非常的耗时
最终的猜想应该是这个样子:如果cell是固定大小,不是自适应高度的,用哪种方式都可以.不会出现什么问题.
但是如果是使用自适应高度,预估行高的话,如果把数据全部添加到数组中,然后再更新界面,这时可能由于预估行高的缘故,界面跳动过大,不小心触发上拉刷新.(这里只是个人猜测,如果有高手解惑,小弟表示感谢.)
这时就需要数据源每次发生改变,就更新一次界面.否则可能会发生上述问题.

如果看不懂我的叙述也不要紧,记住每当数据源发生变化,就更新一次界面就不会出现问题.(假使一共请求20条数据,每当在数组中增加一条数据,就更新一次界面.)

还是做个伪代码吧…..

//可能会出现问题:
for x in xxx{
    arr.append(x) //swift  
    [arr addObject: x] //OC
}
tableView.reloadData   //OC: [tableView reloadData]
//不会出现问题:
for x in xxx{
    arr.append(x) //swift
    [arr addObject: x] //OC
    tableView.reloadData  //OC: [tableView reloadData]
}

你可能感兴趣的:(iOS-OC)