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
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
830
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
RTSPクライアントを自作してみた話
simotin13
0
570
JavaDoc 再入門
nagise
0
320
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
240
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
120
Modding RubyKaigi for Myself
yui_knk
0
920
スマートグラスで並列バイブコーディング
hyshu
0
120
技術記事、 専門家としてのプログラマ、 言語化
mizchi
4
2.9k
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
240
Webフレームワークの ベンチマークについて
yusukebe
0
160
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
5.3k
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
530
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
Are puppies a ranking factor?
jonoalderson
1
3.5k
The Curious Case for Waylosing
cassininazir
1
380
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
470
エンジニアに許された特別な時間の終わり
watany
107
250k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
Designing Powerful Visuals for Engaging Learning
tmiket
1
410
Crafting Experiences
bethany
1
180
Scaling GitHub
holman
464
140k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
Balancing Empowerment & Direction
lara
6
1.2k
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