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
パフォーマンス改善とユニットテスト
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
shtnkgm
March 26, 2019
Programming
1.7k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
パフォーマンス改善とユニットテスト
Bonfire iOS #5 発表資料
shtnkgm
March 26, 2019
More Decks by shtnkgm
See All by shtnkgm
Combine入門
shtnkgm
2
320
Property Wrappers
shtnkgm
0
370
Saliency Detection
shtnkgm
0
86
iOSのコードベースレイアウト
shtnkgm
2
840
20190117_iOSLT_CBLinSwift.pdf
shtnkgm
0
120
SwiftとFunctional Reactive Programming
shtnkgm
0
200
20180710_iOSLT_iOSでDarkModeを実装する
shtnkgm
0
120
20180410_iOSLT_SwiftとProtocol-OrientedProgramming
shtnkgm
0
140
20180220_iOSLT_Swiftとオブジェクト間の通知のパターン
shtnkgm
0
170
Other Decks in Programming
See All in Programming
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
570
Vite+ Unified Toolchain for the Web
naokihaba
0
410
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
820
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
380
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
220
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
420
symfony/aiとlaravel/boost
77web
0
110
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.7k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
230
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
340
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
150
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
110
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Code Reviewing Like a Champion
maltzj
528
40k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.6k
Abbi's Birthday
coloredviolet
3
8.4k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
190
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.1k
Ethics towards AI in product and experience design
skipperchong
2
320
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
55k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
1.9k
A designer walks into a library…
pauljervisheath
211
24k
Transcript
#POpSFJ04ʛ!TIUOLHN ύϑΥʔϚϯεվળͱϢχοτςετ
4IPUB/BLBHBNJ ϠϑʔגࣜձࣾʛΤϯδχΞ !TIUOLHN
:BIPPγϣοϐϯά
wJ04ΞϓϦϦϦʔε wίʔυن wϢχοτςετ w୲J04ΤϯδχΞ ɿʙ ɿສߦʢ0CKFDUJWF$ɿʣ ɿ݅ʢΧόϨοδɿʣ ɿ໊ʢ Ћʣ
ݱࡏͷׂ w ύϑΥʔϚϯεվળ w ٕज़తෛ࠴ͷղফ w ։ൃޮͷվળ ʢGBTUMBOFɺ4XJGU-JOUɺ%BOHFSɺ4XJGU(FOɺ4DSFXESJWFSDEɺ1FSJQIFSZʣ ػೳ։ൃ νʔϜ
ٕज़վળ νʔϜ
ࠓ͍ͨ͜͠ͱ
:BIPPγϣοϐϯάΞϓϦͷ ύϑΥʔϚϯεվળͱ Ϣχοτςετ׆༻ͷ
˞ܭଌࣗࣾௐ 501ը໘ ΞϓϦىಈʙදࣔ·Ͱͷվળ #FGPSFɿฏۉඵ
ΞϓϦىಈʙදࣔ·Ͱͷվળ #FGPSFɿฏۉඵ ˞ܭଌࣗࣾௐ ݮ 501ը໘ "GUFSɿฏۉඵ
None
ϘτϧωοΫՕॴͷௐࠪ
"1*௨৴Ͱ ಈతʹมΘΔλϒϝχϡʔ
ىಈ͔Β501දࣔ·ͰͷྲྀΕ
ىಈ "1*௨৴ "1*௨৴ λϒදࣔ 501දࣔ
ىಈ "1*௨৴ "1*௨৴ λϒදࣔ 501දࣔ
ىಈ "1*௨৴ "1*௨৴ λϒදࣔ 501දࣔ λϒՃ
ํ0,ɺͰ
ϓϩάϥϜͷෳࡶ͕૿͢ ฒྻԽඇಉظԽʹΑΓ
վमରͷΫϥε͕طʹෳࡶ
վमରͷΫϥεΛͳ͕ΊΔ w ॳظ࣮͔Βܦ͍ͬͯΔ w मਖ਼ͷܧ͗͠ʹΑΔ'BU7$ʢߦPWFSʣ w 7JFXϏδωεϩδοΫ͕ࠞࡏ͠ɺաଟ w Ϣχοτςετ΄΅ͳ͠
Ͳ͏͢Δʁ
طଘΫϥε 'BU7$
طଘΫϥε Ճ ❌͞ΒʹංେԽ Ճ
طଘΫϥε Ϋϥε Ϋϥε Ϋϥε খ͘͞Γग़͠
طଘΫϥε Ϋϥε Ϋϥε Ϋϥε ฒྻԽॲཧ ඇಉظԽॲཧ
Ϋϥε Ϋϥε Ϋϥε طଘΫϥε ✅ ✅ ✅ Ϣχοτςετ
Ϋϥε Ϋϥε Ϋϥε طଘΫϥε ✅ ✅ ✅ ґଘΫϥεΛ֎෦͔Βઃఆ ʢ%FQFOEFODZ*OKFDUJPOʣ *OKFDU
*OKFDU
.PDL Ϋϥε .PDL Ϋϥε Ϋϥε طଘΫϥε ✅ ✅ ✅ ✅
্ҐϨΠϠʔ Ϣχοτςετ
͏গ͠۩ମతʹ w λϒϝχϡʔͷදࣔϩδοΫΛΓग़͠ɺ 4UBDL7JFXԽ w ঢ়ଶཧͱ௨৴ϩδοΫΛΓग़͠ w λϒͷछྨΛFOVNͰ࠶ཧʜͳͲ
7JFXϨΠϠʔͷϢχοτςετ
ॻ͖ʹ͍͕͘ɺ ෆ͕҆͋Εॻ͘
7JFXͷςετ͕ॻ͖ʹ͍͘ཧ༝ w νΣοΫର͕7JFXͷදࣔͱͳΔͨΊɺग़ྗΛऔಘͮ͠Β͍ ʢ҉తͳग़ྗͷνΣοΫʣ w 6*,JUͷϥΠϑαΠΫϧʹԊͬͯදࣔྃΛͭ ʢඇಉظςετʣ
// Tips: ΞΫηεम০ࢠΛมߋ͢Δ // before @IBOutlet private weak var titleLabel:
UILabel! // after @IBOutlet private(set) weak var titleLabel: UILabel!
// Tips: subviews͔ΒಛఆΫϥεViewͷΈΛऔಘ͢Δ let labels = view.findViews(subclassOf: UILabel.self) let tabViews
= view.findViews(subclassOf: TabView.self) extension UIView { var recursiveSubviews: [UIView] { return subviews + subviews.flatMap { $0.recursiveSubviews } } func findViews<T: UIView>(subclassOf: T.Type) -> [T] { return recursiveSubviews.compactMap { $0 as? T } } }
// Tips: දࣔྃͷػ func waitUntil(condition: () -> Bool) { while
!condition() { RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.001)) } }
7JFXͷϢχοτςετΛ ॻ͍ͯΑ͔ͬͨ͜ͱ
Ϣχοτςετ͕௨Βͳ͍ λϒͷ͕ظ௨ΓʹͳΒͳ͍ ❌
खಈςετͰҰݟਖ਼͍͠
%FCVH7JFX)JFSBSDIZ
None
None
None
None
ݪҼ 6*4UBDL7JFXͷαϒϏϡʔͷআͷํ
6*4UBDL7JFXͰλϒΛཧ λϒͷՃɿBEE"SSBOHFE4VCWJFX @ λϒͷআɿSFNPWF"SSBOHFE4VCWJFX @
// arrangedSubviewsΛআ stackView.arrangedSubviews .forEach { stackView.removeArrangedSubview($0) } // subviewsΛআ stackView.subviews
.forEach { $0.removeFromSuperview() }
7JFXͷϢχοτςετͰ खಈςετͰؾ͖ͮʹ͍͘ ʹؾ͚ͮͨ
ৼΓฦΓ
w ϢχοτςετΛॻ͖ͳ͕ΒϦϑΝΫλͯ͠ ࠓޙϝϯς͍͢͠ίʔυʹ w खಈςετͰͷखΓ͕࠷খݶ ʢόάΛઌग़͠Ͱݕग़ʣ (
w ϩάૹ৴͍ͯ͠Δσʔλͷத͕Ұ෦ܽଛ w ϢχοτςετɺखಈςετͰݕͰ͖ͣ )
ߴԽ͗ͯ͢͠લఏ่͕݅ΕΔ w ߴԽલλΠϛϯά͕͔ͬͨͷͰɺਖ਼͘͠ಈ࡞ w ϩάૹ৴ͷλΠϛϯά͕ૣ͘ͳΓɺ ඞཁͳσʔλ͕औΕͯͳ͍ͷʹϩάૹ৴ ૹ৴σʔλͷऔಘ ϩάૹ৴˓ ϩάૹ৴º ߴԽ
Ϟδϡʔϧؒͷ҉తͳґଘؔ ϢχοτςετͰؾ͖ͮʹ͍͘
func sendLog() { assert(analyticsData.foo != nil, "foo͕औಘͰ͖͍ͯΔ͜ͱ") logger.sendLog() }
·ͱΊ
·ͱΊ w ύϑΥʔϚϯεվળͱϦϑΝΫλϦϯά Ͱ͖ΕηοτͰ w खಈςετͰؾ͚ͮͳ͍ෆ۩߹ʹ 7JFXͷςετͰؾ͚ͮͨ w Ϣχοτςετ͚ͩͰͳ͘"TTFSUJPO׆༻
͋Γ͕ͱ͏͍͟͝·ͨ͠ #POpSFJ04ʛ!TIUOLHN