Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
tableViewとcoolectionviewのパフォーマンスチューニング
Search
kichikuchi
February 02, 2017
Technology
1
580
tableViewとcoolectionviewのパフォーマンスチューニング
kichikuchi
February 02, 2017
Tweet
Share
More Decks by kichikuchi
See All by kichikuchi
swiftにおける遅延評価
kichikuchi
0
2.8k
AB Tests in Mobile App
kichikuchi
1
1.9k
GameplayKit, GKRandomSource, GKRandomDistribution
kichikuchi
1
280
Other Decks in Technology
See All in Technology
Amazon Bedrockで実現する 新たな学習体験
kzkmaeda
1
380
AWS アーキテクチャ作図入門/aws-architecture-diagram-101
ma2shita
29
9.5k
(非公式) AWS Summit Japan と 海浜幕張 の歩き方 2025年版
coosuke
PRO
1
330
20250623 Findy Lunch LT Brown
3150
0
750
新卒3年目の後悔〜機械学習モデルジョブの運用を頑張った話〜
kameitomohiro
0
370
Model Mondays S2E02: Model Context Protocol
nitya
0
180
AWS Summit Japan 2025 Community Stage - App workflow automation by AWS Step Functions
matsuihidetoshi
1
140
UIテスト自動化サポート- Testbed for XCUIAutomation practice
notoroid
0
110
ハノーバーメッセ2025座談会.pdf
iotcomjpadmin
0
150
Snowflake Summit 2025全体振り返り / Snowflake Summit 2025 Overall Review
mtpooh
2
190
白金鉱業Meetup_Vol.19_PoCはデモで語れ!顧客の本音とインサイトを引き出すソリューション構築
brainpadpr
2
470
Snowflake Summit 2025 データエンジニアリング関連新機能紹介 / Snowflake Summit 2025 What's New about Data Engineering
tiltmax3
0
220
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Designing Experiences People Love
moore
142
24k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
The Pragmatic Product Professional
lauravandoore
35
6.7k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
Balancing Empowerment & Direction
lara
1
340
Practical Orchestrator
shlominoach
188
11k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
920
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ͳͲͰࡁΉ ͳΒͦͪΒͰࡁ·͢