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ā)生了什么.
當我們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.
當列表界面數(shù)據(jù)不怎么變化的時候, 幾乎感知不到這種異常的存在, 因為reloadData返回之后, 下一次loop就開始執(zhí)行異步的操作了. 但是當列表界面的數(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也是我們的老熟人, 大家肯定對他都很熟悉, 多的廢話也就沒必要說了, 個人認為, UIButton這個控件我是非常喜歡的. 在這里介紹給大家一個它的set方法.
[btn setExclusiveTouch:YES];
我們可以command+單擊進入里面看看
介個set方法的作用是: 避免在一個界面上同時點擊多個button, 即同時點擊button1和button2.有興趣的小伙伴可以試試會出現(xiàn)什么問題```
分享結(jié)束,謝謝大家,希望能夠共同進步!
開源```還是開源```