UITableView reloadData的正確方法

UITableView reloadData的正確方法

轉(zhuǎn)至一個(gè)牛人的貼,自己看了深有收獲霎挟,轉(zhuǎn)載了保存窝剖,也給學(xué)習(xí)開發(fā)IOS的同行參考。

相信很多人會(huì)遇到這種情況酥夭,當(dāng)tableView正在滾動(dòng)的時(shí)候,如果reloadData脊奋,偶爾發(fā)生App crash的情況熬北。 這種情況有時(shí)候有,有時(shí)候沒有诚隙,已經(jīng)難倒了很多人讶隐。直至今天,我在stackoverflow上面久又,仍沒有發(fā)現(xiàn)真正有說到其本質(zhì)的帖子巫延。我的處女貼,選擇這個(gè)問題來闡述一下我的觀點(diǎn)地消。

小弟我英語很好炉峰,一般都是用英語記筆記,當(dāng)然脉执,我知道疼阔,論壇憤青很多,如果只貼英文出來半夷,肯定找罵婆廊。 故簡單翻譯一下,以顯示我的誠意巫橄。 原英文筆記附在后面淘邻。 請大家不要挑英語語法錯(cuò)誤了,筆記就是筆記湘换,不是出書宾舅。

第一句話敬尺,闡述問題的本質(zhì):在tableView的dataSource被改變 和 tableView的reloadData被調(diào)用之間有個(gè)時(shí)間差,而正是在這個(gè)期間贴浙,tableView的delegate方法被調(diào)用砂吞,如果新的dataSource的count小于原來的dataSource count,crash就很有可能發(fā)生了崎溃。

下面的筆記提供了兩種解決方案蜻直,和記錄了一個(gè)典型的錯(cuò)誤,即 在background thread中修改了datasource,雖然調(diào)用[self.tableViewperformSelectorOnMainThread:@selector(reloadData)withObject:nilwaitUntilDone:NO];

記住正確的原則:Always change the dataSourceand(注意這個(gè)and)reloadData in the mainThread. What's more, reloadData should be calledimmediatelyafter the dataSource change.

If dataSource is changed but tableView's reloadData method is not called immediately, the tableView may crash if it's in scrolling.

Crash Reason:There is still a time gap between the dataSource change and reloadData. If the table is scrolling during the time gap, the app may Crash!!!!

WRONG WAY:

Following codes is WRONG: even the reloadData is called in main thread, there is still a time gap between the dataSource change and reloadData. If the table is scrolling during the time gap, the app may Crash!!!!

wrong codes samples:

-(void) changeDatasource_backgroundThread

{

@autoreleasepool{

[self.dataSourceArrayremoveAllObjects];

[self.tableViewperformSelectorOnMainThread:@selector(reloadData)withObject:nilwaitUntilDone:NO];

}

}

RIGHT WAY:

Principle:Always change dataSource inMAINthread and call the reloadDataimmediatelyafter it.

Option 1:If the operation to change the dataSource should be executed in background, the operation can create a temp dataSource array and pass it to main thread with notification, the main thread observes the notification,assign the tmpDataSource to dataSource and reload the tableView by reloadData.

Option 2:In the background, call the GDC dispatch_async to send the two methods to main threadtogether.

dispatch_async(dispatch_get_main_queue(), ^{

self.dataSourceArray= a new Array.

[self.tableView reloadData];

});

轉(zhuǎn)至:

http://blog.sina.com.cn/s/blog_5ae5372b0101azxr.html

http://www.cocoachina.com/bbs/read.php?tid=81462

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袁串,一起剝皮案震驚了整個(gè)濱河市概而,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囱修,老刑警劉巖赎瑰,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異破镰,居然都是意外死亡餐曼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門鲜漩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來源譬,“玉大人,你說我怎么就攤上這事孕似〔饶铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵喉祭,是天一觀的道長养渴。 經(jīng)常有香客問我,道長泛烙,這世上最難降的妖魔是什么理卑? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮胶惰,結(jié)果婚禮上傻工,老公的妹妹穿的比我還像新娘。我一直安慰自己孵滞,他們只是感情好中捆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坊饶,像睡著了一般泄伪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匿级,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天蟋滴,我揣著相機(jī)與錄音染厅,去河邊找鬼。 笑死津函,一個(gè)胖子當(dāng)著我的面吹牛肖粮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尔苦,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼涩馆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了允坚?” 一聲冷哼從身側(cè)響起魂那,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稠项,沒想到半個(gè)月后涯雅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡展运,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年活逆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乐疆。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡划乖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挤土,到底是詐尸還是另有隱情,我是刑警寧澤误算,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布仰美,位于F島的核電站,受9級特大地震影響儿礼,放射性物質(zhì)發(fā)生泄漏咖杂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一蚊夫、第九天 我趴在偏房一處隱蔽的房頂上張望诉字。 院中可真熱鬧,春花似錦知纷、人聲如沸壤圃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伍绳。三九已至,卻和暖如春乍桂,著一層夾襖步出監(jiān)牢的瞬間冲杀,已是汗流浹背效床。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留权谁,地道東北人剩檀。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像旺芽,于是被迫代替她去往敵國和親沪猴。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容