iOS UITableview開發(fā)中會導(dǎo)致程序崩潰的問題

iOS開發(fā)中的異步網(wǎng)絡(luò)框架OC的AFNetworking及Swift的Alamofire是我們大多數(shù)項目中使用的, 也有公司使用自己網(wǎng)絡(luò)請求框架. 談到網(wǎng)絡(luò)請求,肯定離不開同步還有異步, 同步和異步是基礎(chǔ)的編程概念, 也是我們我們再開發(fā)中經(jīng)常用到的.

UITableView,UICollectionView

對于UITableview的使用, 大家肯定是熟悉的,在同步的情況下我們是很少出現(xiàn)問題的. 問題就出現(xiàn)在異步的情況下, 我們可能會出現(xiàn)這樣或者那樣的錯誤.(同理UICollectionView也是一樣的,以UITableView舉例)

具體來說, 就是reloadData這個調(diào)用中所包含的異步操作. 先來看看執(zhí)行reloadData都發(fā)生了什么.

當(dāng)我們reloadData的時候, 我們本意是刷新UITableView, 隨后會進入一系列UITableViewDataSource和UITableViewDelegate的回調(diào),其中有些是和reloadData同步發(fā)生的, 有些則是異步發(fā)生的.

同步:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

異步:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

很明顯在cellForRowAtIndexPath的時候, cell的狀態(tài)可能會發(fā)生變化, 我們在異步接收到刷新數(shù)據(jù)時reloadData. UITableview的數(shù)據(jù)源數(shù)組肯定被修改過, 這時候, 極有可能出現(xiàn)數(shù)組越界的異常,導(dǎo)致程序crash.

當(dāng)列表界面數(shù)據(jù)不怎么變化的時候, 幾乎感知不到這種異常的存在, 因為reloadData返回之后, 下一次loop就開始執(zhí)行異步的操作了. 但是當(dāng)列表界面的數(shù)據(jù)有可能經(jīng)常變化的時候, 尤其是在多線程的場景下, 就會出現(xiàn)偶現(xiàn)的bug了.

解決

方法一

對刷新方法進行控制

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

if(_dataArray.count > 0)....

}

方法二

為刷新添加隊列queue, 頻繁的調(diào)用reloadData還會造成界面的卡頓, 所以此時建立一個Queue, 這樣既保證了刷新,也會使界面不會出現(xiàn)各種卡頓的問題, 這種方法比上面復(fù)雜一點, 但是在實際運用中肯定會更加安全.

方法三

暫時想不到了,肯定有更好的解決辦法等待著我們的發(fā)現(xiàn)...


UIButton

UIButton也是我們的老熟人, 大家肯定對他都很熟悉, 多的廢話也就沒必要說了, 個人認(rèn)為, UIButton這個控件我是非常喜歡的. 在這里介紹給大家一個它的set方法.

[btn setExclusiveTouch:YES];

我們可以command+單擊進入里面看看



介個set方法的作用是: 避免在一個界面上同時點擊多個button, 即同時點擊button1和button2.有興趣的小伙伴可以試試會出現(xiàn)什么問題```

分享結(jié)束,謝謝大家,希望能夠共同進步!

開源```還是開源```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容