パフォーマンス改善とユニットテスト

E45f9c343d90c74554c65c89c6f861bc?s=47 shtnkgm
March 26, 2019

 パフォーマンス改善とユニットテスト

Bonfire iOS #5 発表資料

E45f9c343d90c74554c65c89c6f861bc?s=128

shtnkgm

March 26, 2019
Tweet

Transcript

  1. #POpSFJ04ʛ!TIUOLHN ύϑΥʔϚϯεվળͱϢχοτςετ

  2. 4IPUB/BLBHBNJ ϠϑʔגࣜձࣾʛΤϯδχΞ !TIUOLHN

  3. :BIPPγϣοϐϯά

  4. wJ04ΞϓϦϦϦʔε wίʔυن໛ wϢχοτςετ w୲౰J04ΤϯδχΞ ɿʙ ɿສߦʢ0CKFDUJWF$ɿʣ ɿ݅ʢΧόϨοδɿʣ ɿ໊ʢ Ћʣ

  5. ݱࡏͷ໾ׂ w ύϑΥʔϚϯεվળ w ٕज़తෛ࠴ͷղফ w ։ൃޮ཰ͷվળ
 ʢGBTUMBOFɺ4XJGU-JOUɺ%BOHFSɺ4XJGU(FOɺ4DSFXESJWFSDEɺ1FSJQIFSZʣ ػೳ։ൃ νʔϜ

    ٕज़վળ νʔϜ
  6. ࠓ೔࿩͍ͨ͜͠ͱ

  7. :BIPPγϣοϐϯάΞϓϦͷ ύϑΥʔϚϯεվળͱ Ϣχοτςετ׆༻ͷ࿩

  8. ˞ܭଌ஋͸ࣗࣾௐ΂ 501ը໘ ΞϓϦىಈʙදࣔ·Ͱͷ଎౓վળ #FGPSFɿฏۉඵ

  9. ΞϓϦىಈʙදࣔ·Ͱͷ଎౓վળ #FGPSFɿฏۉඵ ˞ܭଌ஋͸ࣗࣾௐ΂ ࡟ݮ 501ը໘ "GUFSɿฏۉඵ

  10. None
  11. ϘτϧωοΫՕॴͷௐࠪ

  12. "1*௨৴Ͱ
 ಈతʹมΘΔλϒϝχϡʔ

  13. ىಈ͔Β501දࣔ·ͰͷྲྀΕ

  14. ىಈ "1*௨৴ "1*௨৴ λϒදࣔ 501දࣔ

  15. ىಈ "1*௨৴ "1*௨৴ λϒදࣔ 501දࣔ

  16. ىಈ "1*௨৴ "1*௨৴ λϒදࣔ 501දࣔ λϒ௥Ճ

  17. ํ਑͸0,ɺͰ΋

  18. ϓϩάϥϜͷෳࡶ౓͕૿͢ ฒྻԽඇಉظԽʹΑΓ

  19. վमର৅ͷΫϥε͕طʹෳࡶ

  20. վमର৅ͷΫϥεΛͳ͕ΊΔ w ॳظ࣮૷͔Β਺೥ܦ͍ͬͯΔ w मਖ਼ͷܧ͗଍͠ʹΑΔ'BU7$ʢߦPWFSʣ w 7JFX΍ϏδωεϩδοΫ͕ࠞࡏ͠ɺ੹຿աଟ w Ϣχοτςετ΄΅ͳ͠

  21. Ͳ͏͢Δʁ

  22. طଘΫϥε 'BU7$

  23. طଘΫϥε ௥Ճ ❌͞ΒʹංେԽ ௥Ճ

  24. طଘΫϥε Ϋϥε Ϋϥε Ϋϥε খ͘͞੾Γग़͠

  25. طଘΫϥε Ϋϥε Ϋϥε Ϋϥε ฒྻԽॲཧ ඇಉظԽॲཧ

  26. Ϋϥε Ϋϥε Ϋϥε طଘΫϥε ✅ ✅ ✅ Ϣχοτςετ

  27. Ϋϥε Ϋϥε Ϋϥε طଘΫϥε ✅ ✅ ✅ ґଘΫϥεΛ֎෦͔Βઃఆ ʢ%FQFOEFODZ*OKFDUJPOʣ *OKFDU

    *OKFDU
  28. .PDL Ϋϥε .PDL Ϋϥε Ϋϥε طଘΫϥε ✅ ✅ ✅ ✅

    ্ҐϨΠϠʔ Ϣχοτςετ
  29. ΋͏গ͠۩ମతʹ w λϒϝχϡʔͷදࣔϩδοΫΛ੾Γग़͠ɺ
 4UBDL7JFXԽ w ঢ়ଶ؅ཧͱ௨৴ϩδοΫΛ੾Γग़͠ w λϒͷछྨΛFOVNͰ࠶੔ཧʜͳͲ

  30. 7JFXϨΠϠʔͷϢχοτςετ

  31. ॻ͖ʹ͍͕͘ɺ ෆ͕҆͋Ε͹ॻ͘

  32. 7JFXͷςετ͕ॻ͖ʹ͍͘ཧ༝ w νΣοΫର৅͕7JFXͷදࣔͱͳΔͨΊɺग़ྗΛऔಘͮ͠Β͍
 ʢ҉໧తͳग़ྗͷνΣοΫʣ
 w 6*,JUͷϥΠϑαΠΫϧʹԊͬͯදࣔ׬ྃΛ଴ͭ
 ʢඇಉظςετʣ

  33. // Tips: ΞΫηεम০ࢠΛมߋ͢Δ // before @IBOutlet private weak var titleLabel:

    UILabel! // after @IBOutlet private(set) weak var titleLabel: UILabel!
  34. // 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 } } }
  35. // Tips: දࣔ׬ྃͷ଴ػ func waitUntil(condition: () -> Bool) { while

    !condition() { RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.001)) } }
  36. 7JFXͷϢχοτςετΛ ॻ͍ͯΑ͔ͬͨ͜ͱ

  37. Ϣχοτςετ͕௨Βͳ͍ λϒͷ਺͕ظ଴௨ΓʹͳΒͳ͍ ❌

  38. खಈςετͰ͸Ұݟਖ਼͍͠

  39. %FCVH7JFX)JFSBSDIZ

  40. None
  41. None
  42. None
  43. None
  44. ݪҼ 6*4UBDL7JFXͷαϒϏϡʔͷ࡟আͷ࢓ํ

  45. 6*4UBDL7JFXͰλϒΛ؅ཧ λϒͷ௥ՃɿBEE"SSBOHFE4VCWJFX @  λϒͷ࡟আɿSFNPWF"SSBOHFE4VCWJFX @

  46. // arrangedSubviewsΛ࡟আ stackView.arrangedSubviews .forEach { stackView.removeArrangedSubview($0) } // subviewsΛ࡟আ stackView.subviews

    .forEach { $0.removeFromSuperview() }
  47. 7JFXͷϢχοτςετͰ खಈςετͰ͸ؾ͖ͮʹ͍͘ ໰୊ʹؾ͚ͮͨ

  48. ৼΓฦΓ

  49. w ϢχοτςετΛॻ͖ͳ͕ΒϦϑΝΫλͯ͠
 ࠓޙ΋ϝϯς͠΍͍͢ίʔυʹ w खಈςετͰͷख໭Γ͕࠷খݶ
 ʢόάΛઌग़͠Ͱݕग़ʣ (

  50. w ϩάૹ৴͍ͯ͠Δσʔλͷத਎͕Ұ෦ܽଛ w ϢχοτςετɺखಈςετͰ΋ݕ஌Ͱ͖ͣ )

  51. ߴ଎Խ͗ͯ͢͠લఏ৚่͕݅ΕΔ w ߴ଎Խલ͸λΠϛϯά͕஗͔ͬͨͷͰɺਖ਼͘͠ಈ࡞ w ϩάૹ৴ͷλΠϛϯά͕ૣ͘ͳΓɺ
 ඞཁͳσʔλ͕औΕͯͳ͍ͷʹϩάૹ৴ ૹ৴σʔλͷऔಘ ϩάૹ৴˓ ϩάૹ৴º ߴ଎Խ

  52. Ϟδϡʔϧؒͷ҉໧తͳґଘؔ܎͸
 ϢχοτςετͰ͸ؾ͖ͮʹ͍͘

  53. func sendLog() { assert(analyticsData.foo != nil, "foo͕औಘͰ͖͍ͯΔ͜ͱ") logger.sendLog() }

  54. ·ͱΊ

  55. ·ͱΊ w ύϑΥʔϚϯεվળͱϦϑΝΫλϦϯά͸
 Ͱ͖Ε͹ηοτͰ w खಈςετͰ͸ؾ͚ͮͳ͍ෆ۩߹ʹ
 7JFXͷςετͰؾ͚ͮͨ w Ϣχοτςετ͚ͩͰͳ͘"TTFSUJPO΋׆༻

  56. ͋Γ͕ͱ͏͍͟͝·ͨ͠ #POpSFJ04ʛ!TIUOLHN