🍎 iOS/UIKit

[iOS] reloadData κ°œμš” 및 참고사항

deep_lee 2023. 3. 25. 16:42

πŸ“‹ reloadData() κ°œμš” 및 참고사항

 

πŸ“Œ reloadData()

reloadData()λŠ”  ν…Œμ΄λΈ”λ·°μ˜ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ΄λ‹€. 

ν…Œμ΄λΈ”λ·° μΈμŠ€ν„΄μŠ€μ—μ„œ μ ‘κ·Όν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

reloadData()λŠ” ν…Œμ΄λΈ” 뷰의 ν˜„μž¬ λ³΄μ΄λŠ” 전체열(row), μ„Ήμ…˜(section)을 μ—…λ°μ΄νŠΈν•  λ•Œ μ‚¬μš©ν•œλ‹€.

reloadData()λŠ” νŠΉμ • μ—΄, μ„Ήμ…˜μ˜ 뢀뢄적 μ—…λ°μ΄νŠΈκ°€ μ•„λ‹Œ, ν…Œμ΄λΈ” 뷰의 전체 μ˜μ—­μ„ μ—…λ°μ΄νŠΈ ν• λ•Œ νš¨κ³Όμ μ΄λ‹€.

 

 

πŸ“Œ Declaration μ„ μ–Έ 방식

func reloadData()

 

reloadData()λŠ” ν…Œμ΄λΈ”λ·°μ˜ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ‘œ, μœ„μ™€ 같이 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

 

 

ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό κ°–κ³  μžˆλŠ” νƒ€μž…μ€ UICollectionView, UITableView 등이 μžˆλ‹€.
이번 ν¬μŠ€νŒ…μ—μ„œλŠ” TableViewλ₯Ό κΈ°μ€€μœΌλ‘œ 보도둝 ν•˜κ² λ‹€.

 

 


πŸ“Œ reloadData() μ‚¬μš©λ°©λ²•

 

μ„Ήμ…˜μ˜ HeaderView / FooterView, Cell, Index λ°°μ—΄ 등을 ν¬ν•¨ν•˜λŠ” ν…Œμ΄λΈ”μ˜ 데이터λ₯Ό reload ν›„ μž¬κ΅¬μ„± ν•˜λ € ν•  λ•Œ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

μ•žμ„œ λ§ν–ˆλ“―μ΄, reloadData()λŠ” μ—…λ°μ΄νŠΈ κ°„ 효율적인 방식을 μ‚¬μš©ν•œλ‹€. 

이 λ•Œ ν…Œμ΄λΈ”λ·°μ˜ 전체 μ˜μ—­μ„ μ—…λ°μ΄νŠΈ ν•˜λŠ” 것이 μ•„λ‹Œ, ν˜„μž¬ λ³΄μ΄λŠ” μ—΄ λ§Œμ„ μ—…λ°μ΄νŠΈ ν•΄μ€€λ‹€. λ˜ν•œ reload 될 λ•Œμ˜ 결과에 λŒ€ν•΄ ν…Œμ΄λΈ”μ€ μžλ™μ μœΌλ‘œ offset을 μ‘°μ ˆν•œλ‹€. 

 

λ˜ν•œ tableViewκ°€ reloadData()λ₯Ό ν˜ΈμΆœν•œ ν›„

-> tableViewκ°€ κ°–κ³  μžˆλŠ” 데이터λ₯Ό μ™„λ²½νžˆ μ—…λ°μ΄νŠΈ ν–ˆλ‹€λ©΄,

-> 이후 ν•΄λ‹Ή tableView의 delegate(UITableViewDelegate), dataSource(UITableViewDataSource) κ΄€λ ¨ λ©”μ„œλ“œλŠ” 상황과 쑰건에 맞게 ν˜ΈμΆœλœλ‹€.

 

κ·ΈλŸ¬λ―€λ‘œ, reloadData() 호좜과 μ—°κ³„ν•œ μ„ΈλΆ€ λ™μž‘, 이벀트λ₯Ό 관리할 λ•Œ 이점을 μ—Όλ‘ν•˜κ³  델리게이트, 데이터 μ†ŒμŠ€ λ©”μ„œλ“œλ₯Ό ν•¨κ»˜ ν™œμš©ν•˜λŠ”κ²ƒμ΄ μ’‹λ‹€.

 

 

 


πŸ“Œ reloadData() μ‚¬μš© κ°„ μ£Όμ˜μ‚¬ν•­

 

1. tableView의 행을 제거 및 μ‚½μž…ν•˜λŠ” μž‘μ—…μ„ ν•  λ•Œ, reloadData() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œλŠ” μ•ˆλœλ‹€. 특히 beginUpdates(), endUpdates()와 같은 λ©”μ„œλ“œμ˜ 호좜이 μžˆμ„ λ•Œ μ• λ‹ˆλ©”μ΄μ…˜ 블둝 λ‚΄μ—μ„œ μ‚¬μš©ν•΄μ„œ μ•ˆλœλ‹€.

 

2. tableView의 λ³΄μ΄λŠ” μ˜μ—­ 전체가 μ•„λ‹Œ μΌλΆ€λ§Œ μ—…λ°μ΄νŠΈ/μ‚½μž…/μ‚­μ œ ν•˜κ³ μž ν• λ•ŒλŠ” indexPath 배열을 μ‚¬μš©ν•΄μ„œ reloadRows(at:with:)둜 μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜, perfromBatchUpdates(_:compeltion)을 μ‚¬μš©ν•˜λŠ” λ“±, reloadData() λ©”μ„œλ“œ λŒ€μ‹  λ‹€λ₯Έ 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.

 

3. λ˜ν•œ reloadData() λ©”μ„œλ“œλŠ” UIλ₯Ό λ³€ν™”μ‹œν‚€λŠ” λ©”μ„œλ“œλ‘œ λ°˜λ“œμ‹œ λ©”μΈμŠ€λ ˆλ“œμ—μ„œ λ™μž‘ν•΄μ•Ό ν•œλ‹€.

λ§Œμ•½ 클둜져 λ“±μ—μ„œ λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œλ‘œ λ™μž‘μ΄ 될 λ•ŒλŠ” DispatchQueueλ‚˜ OperationQueue 등을 ν™œμš©ν•΄μ„œ 메인 μŠ€λ ˆλ“œ(main thread)μ—μ„œ λ™μž‘ν•˜λ„λ‘ ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

πŸ’‘ μ€‘μš”μ‚¬ν•­
tableView의 ν”„λ‘œνΌν‹° 쀑, hasUncommittedUpdates 값이 true라면, reloadData()λ₯Ό ν˜ΈμΆœν•΄μ„œλŠ” μ•ˆλœλ‹€.
λ§Œμ•½ ν•΄λ‹Ή μž‘μ—…μ„ ν•˜κ²Œ 되면 tableView λ‚΄μ—μ„œ reloadData()κ°€ μ‹€ν–‰λ˜κΈ° μ „μ˜ uncommitted된 λ³€ν™”κ°€ μžˆλ‹€λ©΄ ν•΄λ‹Ή 사항듀은 κ°•μ œλ‘œ μ‚­μ œλœλ‹€.