Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
tableViewとcoolectionviewのパフォーマンスチューニング
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
kichikuchi
February 02, 2017
Technology
640
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
tableViewとcoolectionviewのパフォーマンスチューニング
kichikuchi
February 02, 2017
More Decks by kichikuchi
See All by kichikuchi
swiftにおける遅延評価
kichikuchi
0
3k
AB Tests in Mobile App
kichikuchi
1
2.1k
GameplayKit, GKRandomSource, GKRandomDistribution
kichikuchi
1
300
Other Decks in Technology
See All in Technology
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
190
Refining Active Record
shugo
0
150
Tofu-Controller lightning talk @ Containerday 2026
gionn
0
100
Optunaの最新リリースv5.0について
pfn
PRO
0
120
Claude の新機能を、 出た日に触って社内に届けるまで
rfdnxbro
1
170
20261017福岡devIO 「AIは"良いダッシュボード"を作れるか?
jtakeda
0
140
Browser Spec: Testing Hotwire with Ruby
takahashim
1
120
AI駆動開発の時代になったのでトヨタ生産方式から見直す
terurou
7
6k
フロントエンドカンファレンス関西2026 - 速すぎるUIに、待ち時間を
teamlab
PRO
0
130
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
1
580
DGX Spark でどこまでハッキングができるのか?
kash1064
3
1.3k
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Color Theory Basics | Prateek | Gurzu
gurzu
1
490
Game over? The fight for quality and originality in the time of robots
wayneb77
1
300
Prompt Engineering for Job Search
mfonobong
0
520
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
280
YesSQL, Process and Tooling at Scale
rocio
174
15k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
37k
Statistics for Hackers
jakevdp
799
230k
Done Done
chrislema
187
17k
Documentation Writing (for coders)
carmenintech
77
5.6k
From π to Pie charts
rasagy
1
400
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
Transcript
NJOOFͰ࣮ફͨ͜͠ͱ ٠ل(.01&1"#0JOD ϖύϘςοΫΧϯϑΝϨϯε 5BCMF7JFX $PMMFDUJPO7JFXͷ ύϑΥʔϚϯενϡʔχϯά
JPTΤϯδχΞ ٠ل NJOOFࣄۀ෦ϓϩμΫτνʔϜ
·ͣͪ͜ΒΛ͝ཡԼ͍͞
ϗʔϜ 5BCMF7JFX $PMMFDUJPO7JFX $PMMFDUJPO7JFX
χϡʔε 5BCMF7JFX
͓ؾʹೖΓ $PMMFDUJPO7JFX
ݕࡧ݁Ռ $PMMFDUJPO7JFX
NJOOF΄΅શͯͷը໘Ͱ 5BCMF7JFX·ͨ$PMMFDUJPO7JFX Λར༻͍ͯ͠·͢
ύϑΥʔϚϯεվળʹ ͜ΕΒͷνϡʔχϯά͕ ॏཁ
ࠓ͢͜ͱ NJOOFͰߦͬͨνϡʔχϯάํ๏Λ ࣮ྫΛڍ͛ͯհ͠·͢ ͳΊΒ͔λΠϜϥΠϯ ΧελϜΧϝϥϩʔϧ
ͳΊΒ͔λΠϜϥΠϯ
ͳΊΒ͔λΠϜϥΠϯͱ ࢭ·Βͣʹͣͬͱ ԼεΫϩʔϧͰ͖Δ
ͪͳΈʹͳΊΒ͔Ҏલɻɻɻ ϑολʔ͕දࣔ͞ΕΔ "1*ୟ͘ Ϧιʔεऔಘͨ͠Β UBCMF7JFXΛߋ৽ ࡞ݟΔຖʹ ͕ͪ࣌ؒൃੜ͍ͯͨ͠
࣮ॳظʹͬͨ͜ͱ ϑολʔ͕දࣔ͞ΕΔલʹ"1*ୟ͘ ˣ ࣍ϖʔδͷϦιʔεΛऔಘͨ͠Β UBCMF7JFXSFMPBE%BUB
SFMPBE%BUB ͢Δͱ ը໘͕Ұॠݻ·Δ
ॲཧ͕ॏ͍Օॴͷಛఆɾվળ FOE3FGSFTIJOH IFJHIU'PS3PX"U 5BCMF7JFX TJ[F'PS*UFN"U $PMMFDUJPO7JFX
FOE3FGSFTIJOH CFGPSF apiClient.download { result in switch result { case
.success: self.refreshControl.endRefreshing() self.tableView.reloadData() case .failure(_): break } } "1*Λୟ͍ͨޙৗʹFOE3FGSFTIJOH ͍ͯͨ͠
FOE3FGSFTIJOH BGUFS apiClient.download { result in switch result { case
.success: if refreshControl.isRefreshing { refreshControl.endRefreshing() } self.tableView.reloadData() case .failure(_): break } } JT3FGSFTIJOHΛར༻ͯ͠ ඞཁͳ͚࣌ͩFOE3FGSFTIJOH ͢Δ
ߴ͞ܭࢉॲཧCFGPSF func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{ let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")! return cell.frame.size.height } IFJHIU'PS3PX"UͰ DFMMΛΠϯελϯεԽ͍ͯͨ͠
ߴ͞ܭࢉॲཧBGUFS lazy var cellHeight: CGFloat = { let cell =
self.tableView.dequeueReusableCell(withIdentifier: "Cell")! return cell.frame.size.height }() func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return cellHeight } MB[ZWBSͰDFMM)FJHIUΛఆٛ͠ DFMMͷΠϯελϯεԽΛҰ͚ͩʹͨ͠
λΠϜϥΠϯ͕ͳΊΒ͔ʹ
ΧελϜΧϝϥϩʔϧ
ΧελϜΧϝϥϩʔϧͱ Ҏલࣸਅͷબ࣌ʹ σϑΥϧτͷΧϝϥϩʔϧ Λ༻͍ͯͨ͠ͷͰ ࡞Ո͞Μ࡞ը૾Λ ొ͢Δ࣌ʹ Կ։͔ͳ͍ͱ ͍͚ͳ͔ͬͨɻɻɻ ෳͷը૾Λ ҰʹબͰ͖Δ
Χϝϥϩʔϧ
ෳબ࣌ͷৄࡉ༷ DFMMΛλοϓͨ͠Β બͨ͠ॱ൪௨Γʹ ࣈΛߋ৽͍ͨ͠
ෳબ࣌ͷৄࡉ༷ DFMMΛλοϓͨ͠Β બͨ͠ॱ൪௨Γʹ ࣈΛߋ৽͍ͨ͠ ͻͱͭΊ
ෳબ࣌ͷৄࡉ༷ DFMMΛλοϓͨ͠Β બͨ͠ॱ൪௨Γʹ ࣈΛߋ৽͍ͨ͠ ;ͨͭΊ
ෳબ࣌ͷৄࡉ༷ DFMMΛλοϓͨ͠Β બͨ͠ॱ൪௨Γʹ ࣈΛߋ৽͍ͨ͠ ΈͬͭΊ
ෳબ࣌ͷৄࡉ༷ DFMMΛλοϓͨ͠Β બͨ͠ॱ൪௨Γʹ ࣈΛߋ৽͍ͨ͠ ΑͬͭΊ
ෳબ࣌ͷৄࡉ༷ DFMMΛλοϓͨ͠Β બͨ͠ॱ൪௨Γʹ ࣈΛߋ৽͍ͨ͠ ͬͺ͜Ε ΊΔʂ
ෳબ࣌ͷৄࡉ༷ DFMMΛλοϓͨ͠Β બͨ͠ॱ൪௨Γʹ ࣈΛߋ৽͍ͨ͠ ͍ͭ͜Β ߋ৽͢Δඞཁ͕͋Δʂ
࣮ॳظʹͬͨ͜ͱ ηϧશ෦ߋ৽͍ͨ͠ ˣ ૉʹUBCMF7JFXSFMPBE%BUB
ϚγϯεϖοΫ ࣗͷJ1IPOFTͰͳ͘ಈ͍ͯͨ ˣ σϓϩΠήʔτʹ͋͛ͯΈΜͳʹ৮ͬͯΒ͏ ˣ J1IPOFTϢʔβ͞Μ͔ΒηϧΛλοϓ͢Δຖ ʹը໘͕ݻ·Δͱͷใࠂ͕ɻɻɻ
ߋ৽ॲཧΛܰ͘͢Δඞཁ͕ʂʂ
ߋ৽ͷܰྔԽ WJTJCMF$FMMT XJMM%JTQMBZDFMM
WJTJCMF$FMMTͰݟ͑ͯΔ͚ͩߋ৽ collectionView.visibleCells.forEach { cell in if let indexPath = collectionView.indexPath(for:
cell) { cell.update(with: products[indexPath.row]) } } DFMMͷߋ৽͚ͩͰ͖ΔͷͰ SFMPBE%BUB ͱൺΔͱѹతʹܰྔʂʂ
͕ͨͩ͠ɻɻɻ ΪϦΪϦը໘֎ͷ બதͷηϧ͕͋Δ ͱߋ৽Ͱ͖ͳ͍ දࣔൣғ
XJMM%JTQMBZDFMM func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath:
IndexPath) { cell.update(with: products[indexPath.row]) } DFMM͕දࣔ͞ΕΔલʹߋ৽͢Δ͜ͱͰ ߋ৽࿙ΕΛͳ͘͢ʂ
J1IPOFTͰΩϏΩϏಈ͘
ͪͳΈʹ ࠓճWJTJCMF$FMMT XJMM%JTQMBZΛ͍·͕ͨ͠
ଞʹ৭ʑ͋Δ UBCMF7JFX tableView.reloadData() tableView.reloadRows(at: [IndexPath], with: UITableViewRowAnimation) tableView.reloadSections(sections: IndexSet, with:
UITableViewRowAnimation) DPMMFDUJPO7JFX collectionView.reloadData() collectionView.reloadItems(at: [IndexPath]) collectionView.reloadSections(sections: IndexSet)
ΉΈʹSFMPBE%BUB ͤͣ ߋ৽ྖҬʹԠͯ͡ϝιουΛ ͍͚Δʂ
·ͱΊ w ೋͭͷ࣮ྫΛڍ͛ͯνϡʔχϯάํ๏Λհͨ͠ w 6*ʹؔ͢Δॲཧඞཁͳ࣌ʹ͚ͩ͢Δ w FOE3FGSFTIJOH JT3FGSFTIJOHͷ͚࣌ͩݺͿ w ߴ͞ܭࢉॲཧ
IFJHIU'PS3PX"U TJ[F'PS*UFN"U ܰྔ ʹ͢Δ w ΉΈʹSFMPBE%BUB ͠ͳ͍ w WJTJCMF$FMMT SFMPBE3PXT SFMPBE4FDUJPOTͳͲͰࡁΉ ͳΒͦͪΒͰࡁ·͢