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
590
tableViewとcoolectionviewのパフォーマンスチューニング
kichikuchi
February 02, 2017
Tweet
Share
More Decks by kichikuchi
See All by kichikuchi
swiftにおける遅延評価
kichikuchi
0
2.9k
AB Tests in Mobile App
kichikuchi
1
2k
GameplayKit, GKRandomSource, GKRandomDistribution
kichikuchi
1
280
Other Decks in Technology
See All in Technology
実践!カスタムインストラクション&スラッシュコマンド
puku0x
0
480
Django's GeneratedField by example - DjangoCon US 2025
pauloxnet
0
150
株式会社ログラス - 会社説明資料【エンジニア】/ Loglass Engineer
loglass2019
4
65k
COVESA VSSによる車両データモデルの標準化とAWS IoT FleetWiseの活用
osawa
1
350
職種の壁を溶かして開発サイクルを高速に回す~情報透明性と職種越境から考えるAIフレンドリーな職種間連携~
daitasu
0
170
自作JSエンジンに推しプロポーザルを実装したい!
sajikix
1
190
KotlinConf 2025_イベントレポート
sony
1
140
要件定義・デザインフェーズでもAIを活用して、コミュニケーションの密度を高める
kazukihayase
0
120
データ分析エージェント Socrates の育て方
na0
5
530
Webアプリケーションにオブザーバビリティを実装するRust入門ガイド
nwiizo
7
860
現場で効くClaude Code ─ 最新動向と企業導入
takaakikakei
1
260
2025年夏 コーディングエージェントを統べる者
nwiizo
0
180
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Visualization
eitanlees
148
16k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
Scaling GitHub
holman
463
140k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Into the Great Unknown - MozCon
thekraken
40
2k
Embracing the Ebb and Flow
colly
87
4.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
920
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
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ͳͲͰࡁΉ ͳΒͦͪΒͰࡁ·͢