๐—ถ๐—ข๐—ฆ/๐Ÿ iOS ๊ฐœ๋…ํŽธ

[iOS / Swift] ํ…Œ์ด๋ธ”๋ทฐ์™€ ์ปฌ๋ ‰์…˜๋ทฐ์˜ ๊ฐฑ์‹  ๋ฉ”์„œ๋“œ

z_ero 2025. 11. 5. 00:11

iOS์—์„œ ํ”ผ๋“œ์ฒ˜๋Ÿผ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด์„ ๋งŒ๋“ค ๋•Œ๋Š” ๋ณดํ†ต UITableView๋‚˜ UICollectionView๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๋ทฐ๋Š” ํ•œ ๋ฒˆ ํ‘œ์‹œ๋œ ํ™”๋ฉด์„ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ฐฑ์‹  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋Œ€ํ‘œ์ ์ธ ๊ฐฑ์‹  ๋ฉ”์„œ๋“œ๋Š” ์ด ๋„ค ๊ฐ€์ง€์ธ๋ฐ์š”. ์ฐจ๋ก€๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ด…์‹œ๋‹ค!

 

๐ŸŽ reloadData()

reloadData()๋Š” UITableView๋‚˜ UICollectionView์—์„œ ํ˜„์žฌ ํ‘œ์‹œ ์ค‘์ธ ๋ชจ๋“  ์…€๊ณผ ์„น์…˜์„ ์™„์ „ํžˆ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด…

“Call this method when the data in your data-source object changes or when you want to force the collection view to update its contents.”

— Apple Developer Documentation

 

์ฆ‰, ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์—ˆ๊ฑฐ๋‚˜, ํ™”๋ฉด์„ ๊ฐ•์ œ๋กœ ์ƒˆ๋กœ๊ณ ์นจํ•ด์•ผ ํ•  ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

reloadData()์˜ ๋‚ด๋ถ€ ๋™์ž‘

reloadData()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”.

  1. ๊ธฐ์กด ์…€๊ณผ ์„น์…˜์˜ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฐ์ดํ„ฐ์†Œ์Šค(UITableViewDataSource)์˜
  3. numberOfSections(in:)๊ณผ tableView(_:numberOfRowsInSection:)๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฐ ์…€์„ ๋‹ค์‹œ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด cellForRowAt์ด ๋ชจ๋“  ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  5. ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ์ƒˆ ์…€์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ „์ฒด ํ™”๋ฉด์„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. 

๊ฒฐ๊ณผ์ ์œผ๋กœ ํ™”๋ฉด์ด ์ „์ฒด ๋ฆฌ๋กœ๋“œ ๋˜๋ฉฐ, ์ด์ „ ์…€์˜ ์ƒํƒœ๋‚˜ ์Šคํฌ๋กค ์œ„์น˜ ๋“ฑ์ด ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ

SNS์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฒŒ์‹œ๊ธ€์„ ๋ณด์—ฌ์ฃผ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ ์•ฑ์„ ์ƒ๊ฐํ•ด๋ณผ๊นŒ์š”?

์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๊ธ€์ด ์—…๋กœ๋“œ๋˜๋ฉด ์ „์ฒด ํ”ผ๋“œ๋ฅผ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์™€์•ผ๊ฒ ์ฃ !

var posts = ["์•„์š” ๊ณผ์ œ ์–ธ์ œํ•˜์ง€ ใ… ใ… ", "์Šค์œ ๊ณต๋ถ€ ์‹œ์ž‘ํ–ˆ์–ด์š”!!"]

func addPost(_ newPost: String) {
    posts.append(newPost)
    tableView.reloadData()
}

 

์ด๋•Œ reloadData()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด ์ „์ฒด ํ”ผ๋“œ๋ฅผ ๋‹ค์‹œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

 

์ฃผ์˜ํ•  ์ 

reloadData()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์…€์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ๋ถ€๋‹ด์ด ํฝ๋‹ˆ๋‹ค.
  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—†์ด ์ฆ‰์‹œ ๊ฐฑ์‹ ๋˜์–ด ํ™”๋ฉด์ด ์ˆœ๊ฐ„์ ์œผ๋กœ ๊นœ๋นก์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์…€์„ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์ค‘(beginUpdates() ๋‚ด๋ถ€ ๋“ฑ)์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ์†Œ์Šค์˜ ํ–‰ ์ˆ˜์™€ ์‹ค์ œ ๋ทฐ์˜ ํ–‰ ์ˆ˜๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, reloadData()๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด์ง€๋งŒ ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๋น„ํšจ์œจ์ ์ด๊ฒ ์ฃ !

๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ํ”ผ๋“œ ํ™”๋ฉด์ด๋ผ๋ฉด ๋‹ค๋ฅธ ๊ฐฑ์‹  ๋ฐฉ์‹์ด ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŽ prepareForReuse()

prepareForReuse()๋Š” UITableViewCell์ด๋‚˜ UICollectionViewCell์ด ์žฌ์‚ฌ์šฉ๋˜๊ธฐ ์ „์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด…

“If a UITableViewCell object has a reuse identifier, the table view invokes this method just before the object is returned from dequeueReusableCell(withIdentifier:).”

— Apple Developer Documentation

 

์žฌ์‚ฌ์šฉ ํ์—์„œ ์…€์ด ๋‹ค์‹œ ๊บผ๋‚ด์ง€๊ธฐ ์ง์ „, ์ด์ „ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„ ์žˆ์ง€ ์•Š๋„๋ก ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

prepareForReuse()์˜ ๋‚ด๋ถ€ ๋™์ž‘

  1. ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ dequeueReusableCell(withIdentifier:)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์…€์„ ํ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  3. ์ด ์‹œ์ ์— ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ prepareForReuse()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  4. ์…€ ๋‚ด๋ถ€์˜ ์ƒํƒœ(ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€ ๋“ฑ)๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ์ดํ›„ cellForRowAt์ด ํ˜ธ์ถœ๋˜์–ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค. 

 

์‚ฌ์šฉ ์˜ˆ์‹œ

์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ ์•ฑ์—์„œ ์—ฌ๋Ÿฌ ๊ฒŒ์‹œ๊ธ€์„ ์Šคํฌ๋กคํ•  ๋•Œ, ์Šคํฌ๋กค์ด ๋น ๋ฅผ ๊ฒฝ์šฐ ์ด์ „ ๊ฒŒ์‹œ๊ธ€์ด ๋‚จ์•„ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ prepareForReuse() ์•ˆ์—์„œ ์…€ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class PostCell: UITableViewCell {
    @IBOutlet weak var usernameLabel: UILabel!
    @IBOutlet weak var contentLabel: UILabel!
    @IBOutlet weak var thumbnailImageView: UIImageView!

    override func prepareForReuse() {
        super.prepareForReuse()
        usernameLabel.text = nil
        contentLabel.text = nil
        thumbnailImageView.image = nil
    }
}

 

์ฃผ์˜ํ•  ์ 

  • ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ญ์ƒ super.prepareForReuse()๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • prepareForReuse()๋Š” ์ดˆ๊ธฐํ™”๋งŒ ๋‹ด๋‹นํ•˜๋ฉฐ, ์‹ค์ œ ๋ฐ์ดํ„ฐ ์„ธํŒ…์€ cellForRowAt์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ์ด๋ฏธ์ง€ ๋กœ๋”ฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ์‹œ์ ์—์„œ ๋‹ค์šด๋กœ๋“œ ์ทจ์†Œ๋‚˜ ์ƒํƒœ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŽ reloadData() vs prepareForReuse() ๋น„๊ต

๊ตฌ๋ถ„ reloadData() prepareForReuse()
์†Œ์† UITableView / UICollectionView UITableViewCell / UICollectionViewCell
ํ˜ธ์ถœ ์ฃผ์ฒด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœ ์‹œ์Šคํ…œ์ด ์ž๋™ ํ˜ธ์ถœ
ํ˜ธ์ถœ ์‹œ์  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ (์ƒˆ ๊ฒŒ์‹œ๊ธ€ ์ถ”๊ฐ€, ์ˆ˜์ • ๋“ฑ) ์…€์ด ์žฌ์‚ฌ์šฉ๋˜๊ธฐ ์ง์ „ (์Šคํฌ๋กค ์ค‘ ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ์“ฐ์ผ ๋•Œ)
๋ชฉ์  ํ™”๋ฉด ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆผ (๋ฐ์ดํ„ฐ ๋ฐ˜์˜) ์…€ ๋‚ด๋ถ€ ์ƒํƒœ ์ดˆ๊ธฐํ™” (์ด์ „ ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ)
์˜ํ–ฅ ๋ฒ”์œ„ ์ „์ฒด ๋ฆฌ์ŠคํŠธ (๋ชจ๋“  ์…€) ํ•ด๋‹น ์…€ ํ•œ ๊ฐœ
ํ˜ธ์ถœ ํ›„ ๋™์ž‘ numberOfRowsInSection → cellForRowAt ๋‹ค์‹œ ํ˜ธ์ถœ๋จ ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€ ๋“ฑ ์…€ ์†์„ฑ ์ดˆ๊ธฐํ™”
์‚ฌ์šฉ ์˜ˆ์‹œ ํ”ผ๋“œ์— ์ƒˆ ๊ธ€์ด ์ถ”๊ฐ€๋˜๋ฉด ์ „์ฒด ์ƒˆ๋กœ๊ณ ์นจ ์Šคํฌ๋กค ์‹œ ์ด์ „ ๊ฒŒ์‹œ๊ธ€์˜ ์ด๋ฏธ์ง€๊ฐ€ ๋‚จ์ง€ ์•Š๋„๋ก ์ดˆ๊ธฐํ™”
์ง์ ‘ ๊ตฌํ˜„ ํ•„์š” ์—ฌ๋ถ€ ์ง์ ‘ ํ˜ธ์ถœํ•ด์•ผ ํ•จ ๋ฉ”์„œ๋“œ ์ž์ฒด๋Š” ์ž๋™ ํ˜ธ์ถœ, ๋‚ด๋ถ€ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋Š” ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•จ

 

๐ŸŽ beginUpdates() / endUpdates()

beginUpdates()์™€ endUpdates()๋Š” ๋‚˜๋จธ์ง€ ์„ธ ๋ฉ”์„œ๋“œ์™€ ๋‹ฌ๋ฆฌ UITableView ์ „์šฉ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ํ–‰(row)์ด๋‚˜ ์„น์…˜(section)์˜ ๋ณ€๊ฒฝ ์ž‘์—…์„ ํ•˜๋‚˜์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋ฌถ์–ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

beginUpdates() / endUpdates()์˜ ๋‚ด๋ถ€ ๋™์ž‘

  1. beginUpdates()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ทธ ์•ˆ์—์„œ ์‚ฝ์ž…(insertRows), ์‚ญ์ œ(deleteRows), ์ด๋™(moveRow) ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  3. endUpdates()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ณ„์‚ฐํ•˜๊ณ , ์ ์ ˆํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์‚ฌ์šฉ ์˜ˆ์‹œ

์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ์—์„œ ํŠน์ • ๊ฒŒ์‹œ๊ธ€์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณผ๊นŒ์š”?

var posts = ["UIKit ๋„ˆ๋ฌด ์žฌ๋ฐŒ์–ด์šฉ", "์˜ค๋Š˜ ์ปคํ”ผ ๋‘ ์ž”์งธ โ˜•๏ธ", "iOS 18 ์—…๋ฐ์ดํŠธ ํ›„๊ธฐ"]

func updateFeed() {
    posts.remove(at: 1)
    posts.append("์ƒˆ๋กœ์šด ํ”ผ๋“œ ์ž‘์„ฑ ์™„๋ฃŒ!")

    tableView.beginUpdates()
    tableView.deleteRows(at: [IndexPath(row: 1, section: 0)], with: .fade)
    tableView.insertRows(at: [IndexPath(row: posts.count - 1, section: 0)], with: .automatic)
    tableView.endUpdates()
}

 

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ beginUpdates() / endUpdates()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ์ž์—ฐ์Šค๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฃผ์˜ํ•  ์ 

  • beginUpdates() ํ˜ธ์ถœ ํ›„ ๋ฐ˜๋“œ์‹œ endUpdates()๋กœ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ญ์ œ ์ž‘์—…์€ ์‚ฝ์ž…๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜์–ด์•ผ ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ์†Œ์Šค ๋ณ€๊ฒฝ๊ณผ UI ์—…๋ฐ์ดํŠธ ์ˆœ์„œ๋ฅผ ๋งž์ถ”์ง€ ์•Š์œผ๋ฉด ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ๋ณ€๊ฒฝ์ด๋ผ๋ฉด insertRows ๋˜๋Š” deleteRows ๋‹จ๋… ํ˜ธ์ถœ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŽ performBatchUpdates(_:completion:)

performBatchUpdates(_:completion:)๋Š” UITableView์™€ UICollectionView ๋ชจ๋‘์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๊ด„ ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์‚ฝ์ž…, ์‚ญ์ œ, ์ด๋™, ๊ฐฑ์‹ ์„ ํ•œ ๋ฒˆ์— ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ž‘์—… ์™„๋ฃŒ ์‹œ์ ์„ completion ๋ธ”๋ก์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

performBatchUpdates(_:completion:)์˜ ๋‚ด๋ถ€ ๋™์ž‘

  1. ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ์ปฌ๋ ‰์…˜๋ทฐ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ณ€๊ฒฝ์„ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ํด๋กœ์ € ์•ˆ์˜ ๋ณ€๊ฒฝ ์ž‘์—…์ด ๋ชจ๋‘ ๋ชจ์•„์ง‘๋‹ˆ๋‹ค.
  3. ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ญ์ œ → ์‚ฝ์ž… → ์ด๋™ → ๊ฐฑ์‹  ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  4. ๋ชจ๋“  ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚˜๋ฉด completion ๋ธ”๋ก์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ํŠนํžˆ UICollectionView์—์„œ ๋ณต์žกํ•œ ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ž…๋‹ˆ๋‹ค.

 

์‚ฌ์šฉ ์˜ˆ์‹œ

ํ”ผ๋“œ ํ™”๋ฉด์—์„œ ํŠน์ • ๊ฒŒ์‹œ๊ธ€์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๊ธ€์„ ๋™์‹œ์— ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

var posts = ["Swift", "Kotlin", "JavaScript"]

func updatePosts() {
    posts.remove(at: 1)
    posts.append("Python")

    collectionView.performBatchUpdates({
        collectionView.deleteItems(at: [IndexPath(item: 1, section: 0)])
        collectionView.insertItems(at: [IndexPath(item: posts.count - 1, section: 0)])
    }, completion: { finished in
        print("์—…๋ฐ์ดํŠธ ์™„๋ฃŒ ์—ฌ๋ถ€: \\(finished)")
    })
}

 

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‚ญ์ œ์™€ ์ถ”๊ฐ€๊ฐ€ ํ•œ ๋ฒˆ์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์‚ฌ์šฉ์ž๋Š” ๋งˆ์น˜ ํ”ผ๋“œ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐฑ์‹ ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋А๋ผ๊ฒŒ ๋˜๊ฒ ์ฃ !

 

์ฃผ์˜ํ•  ์ 

  • ์—ฌ๋Ÿฌ ๋ณ€๊ฒฝ์„ ํ•œ ๋ฒˆ์— ๋ฌถ์–ด ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ญ์ œ๋Š” ์‚ฝ์ž…๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœ ์ „์— ๋ ˆ์ด์•„์›ƒ์ด ์ตœ์‹  ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • (์˜ค๋ž˜๋œ ๋ ˆ์ด์•„์›ƒ์ด๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ reloadData()๊ฐ€ ๋ฐœ์ƒํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
  • ์•ˆ์ „ํ•œ ํ˜ธ์ถœ ์ˆœ์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ → ์ธ๋ฑ์Šค ๊ณ„์‚ฐ → performBatchUpdates ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค.
๋ฐ˜์‘ํ˜•