需求
- 一個controller中包含一個tableview和兩個button隅熙,點擊button墓臭,tableview進行下拉刷新蘸鲸;
- 一個controller中包含一個collectionview和兩個button,點擊button窿锉,collectionview進行下拉刷新酌摇。
實現(xiàn)
使用Swift3.0語法,使用第三方框架MJRefresh(3.0.8版本)進行實現(xiàn)嗡载。
代碼
在按鈕的點擊事件中判斷窑多,是否正在進行刷新,如果正在進行下拉刷新鼻疮,則先停止下拉刷新怯伊,在開啟下拉刷新琳轿。
代碼截圖如下:
效果
問題
從截圖中的動畫效果和打印結(jié)果來看判沟,在tableview中,正在刷新時崭篡,點擊按鈕挪哄,先停止了刷新,然后又開啟的刷新琉闪,運行結(jié)果符合預(yù)期迹炼。但是在collectionview中,正在刷新時颠毙,點擊按鈕斯入,直接停止了刷新,并沒有開啟新的刷新蛀蜜,運行結(jié)果不符合預(yù)期滴某。
為什么同一個框架饼灿,效果不一樣呢证舟?
探索
這個地方漆枚,我們用到了框架提供的是三個方法:
mj_header.isRefreshing()
mj_header.beginRefreshing()
mj_header.endRefreshing()
經(jīng)過查看這三個方法相關(guān)的源碼,我們發(fā)現(xiàn):
在endRefreshing的方法中掖疮,進行了判斷,如果是UICollectionView,endRefreshing的動作延遲了0.1秒執(zhí)行(為什么要延遲0.1s執(zhí)行?),所以我們大膽的猜想,正是由于延遲了這0.1秒,導(dǎo)致collectionView先結(jié)束再刷新實際執(zhí)行是先刷新了兩次,然后在結(jié)束。如果第二次刷新也延遲0.1秒執(zhí)行,應(yīng)該可以得到正確的結(jié)果望迎。
修改后的代碼:
修改后的結(jié)果:
可以看到,延遲執(zhí)行后凌外,實際效果和預(yù)期效果相同了辩尊。
結(jié)論
在MJRefresh(3.0.8版本)中之所以出現(xiàn)上述問題,是由于框架在endRefreshing的方法中康辑,進行了判斷摄欲,如果是UICollectionView,endRefreshing的動作延遲了0.1秒執(zhí)行,導(dǎo)致了上述問題的產(chǎn)生疮薇。所以只要再次刷新時同樣延遲0.1秒執(zhí)行beginRefreshing()就可以解決問題胸墙。
拓展
目前MJRefresh的最新版本為3.1.12,我們來看看在3.1.12版本中這個問題有什么變化按咒。
在這個版本中迟隅,endRefreshing統(tǒng)一添加到主線程異步執(zhí)行。所以我們的代碼也應(yīng)該把第二次beginRefreshing添加到主線程異步執(zhí)行:
思考
從這兩個版本的變化中可以看出励七,3.0.8中的處理是個臨時方法智袭,最終的處理方法是3.1.12中添加到主線程異步執(zhí)行。
在我的經(jīng)驗中呀伙,添加的主線程異步執(zhí)行补履,解決了在一個動畫未執(zhí)行完畢時又添加一個動畫導(dǎo)致沖突的問題添坊。所以猜想作者可能是為了解決正在刷新的動畫或者用戶對scrollview進行操作的動畫和結(jié)束刷新的動畫造成沖突剿另。