重用機(jī)制
代碼
cell = [tableView dequeueReusableCellWithIdentifier:identifier];
機(jī)制
- 系統(tǒng)會創(chuàng)建當(dāng)前屏幕cell數(shù)+1個cell
- 對UITableView向上滑動時腐巢,當(dāng)?shù)谝粋€單元格完全滑出屏幕后泄鹏,此時就會被加入到重用池中,接下來繼續(xù)向上滑動時病曾,當(dāng)一個新的單元格出現(xiàn)時蹬刷,就會根據(jù)指定的identifier標(biāo)示符遥金,從重用池中取出一個可重用的cell
作用
- 避免大量創(chuàng)建實例對象可很,減少內(nèi)存消耗鳄虱,從而提高滑動流暢性
數(shù)據(jù)源同步問題
場景描述
- UITableView有一個數(shù)據(jù)源datasource弟塞,用戶對datasource進(jìn)行了刪除某一個元素的操作,與此同時向服務(wù)器請求數(shù)據(jù)拙已,請求后的數(shù)據(jù)會對datasource進(jìn)行賦值操作决记,此時就產(chǎn)生了數(shù)據(jù)源同步的問題
分析
- 用戶刪除操作是在主線程,請求數(shù)據(jù)并賦值操作是在子線程倍踪,倆個線程會同時對datasource進(jìn)行操作系宫,會產(chǎn)生數(shù)據(jù)源同步問題
解決方式
- 并發(fā)訪問、數(shù)據(jù)拷貝的方式:當(dāng)用戶進(jìn)行刪除操作后建车,將刪除的元素進(jìn)行拷貝記錄扩借,當(dāng)請求數(shù)據(jù)時,用拷貝的元素與請求數(shù)據(jù)進(jìn)行對比缤至,然后進(jìn)行同步的刪除操作潮罪,最后再對datasource進(jìn)行賦值,這樣就解決了數(shù)據(jù)源同步問題(數(shù)據(jù)源數(shù)據(jù)較大時领斥,會有拷貝帶來的性能損耗)
- 串行訪問的方式:(請求數(shù)據(jù)時間過長時嫉到,會對刪除操作有延時)
//串行隊列
dispatch_async(serial,^{
//子線程網(wǎng)絡(luò)請求,數(shù)據(jù)解析
})
//串行隊列
diapatch_sync(serial,^{
//主線程中刪除datasource的某一個元素月洛,因為是被加入到了串行隊列屯碴,因此刪除操作需要等待網(wǎng)絡(luò)請求和數(shù)據(jù)解析結(jié)束后才能進(jìn)行
})
dispatch_sync(main,^{
//更新ui
})