$30 off During Our Annual Pro Sale. View Details »

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

shtnkgm
March 26, 2019

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

Bonfire iOS #5 発表資料

shtnkgm

March 26, 2019
Tweet

More Decks by shtnkgm

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. :BIPPγϣοϐϯά

    View Slide

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

    View Slide

  5. ݱࡏͷ໾ׂ
    w ύϑΥʔϚϯεվળ
    w ٕज़తෛ࠴ͷղফ
    w ։ൃޮ཰ͷվળ

    ʢGBTUMBOFɺ4XJGU-JOUɺ%BOHFSɺ4XJGU(FOɺ4DSFXESJWFSDEɺ1FSJQIFSZʣ
    ػೳ։ൃ
    νʔϜ
    ٕज़վળ
    νʔϜ

    View Slide

  6. ࠓ೔࿩͍ͨ͜͠ͱ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. View Slide

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

    View Slide

  12. "1*௨৴Ͱ

    ಈతʹมΘΔλϒϝχϡʔ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. ํ਑͸0,ɺͰ΋

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. Ͳ͏͢Δʁ

    View Slide

  22. طଘΫϥε
    'BU7$

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    ্ҐϨΠϠʔ
    Ϣχοτςετ

    View Slide

  29. ΋͏গ͠۩ମతʹ
    w λϒϝχϡʔͷදࣔϩδοΫΛ੾Γग़͠ɺ

    4UBDL7JFXԽ
    w ঢ়ଶ؅ཧͱ௨৴ϩδοΫΛ੾Γग़͠
    w λϒͷछྨΛFOVNͰ࠶੔ཧʜͳͲ

    View Slide

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

    View Slide

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

    View Slide

  32. 7JFXͷςετ͕ॻ͖ʹ͍͘ཧ༝
    w νΣοΫର৅͕7JFXͷදࣔͱͳΔͨΊɺग़ྗΛऔಘͮ͠Β͍

    ʢ҉໧తͳग़ྗͷνΣοΫʣ

    w 6*,JUͷϥΠϑαΠΫϧʹԊͬͯදࣔ׬ྃΛ଴ͭ

    ʢඇಉظςετʣ

    View Slide

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

    View Slide

  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(subclassOf: T.Type) -> [T] {
    return recursiveSubviews.compactMap { $0 as? T }
    }
    }

    View Slide

  35. // Tips: දࣔ׬ྃͷ଴ػ
    func waitUntil(condition: () -> Bool) {
    while !condition() {
    RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.001))
    }
    }

    View Slide

  36. 7JFXͷϢχοτςετΛ
    ॻ͍ͯΑ͔ͬͨ͜ͱ

    View Slide

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

    View Slide

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

    View Slide

  39. %FCVH7JFX)JFSBSDIZ

    View Slide

  40. View Slide

  41. View Slide

  42. View Slide

  43. View Slide

  44. ݪҼ
    6*4UBDL7JFXͷαϒϏϡʔͷ࡟আͷ࢓ํ

    View Slide

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

    λϒͷ࡟আɿSFNPWF"SSBOHFE4VCWJFX @

    View Slide

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

    View Slide

  47. 7JFXͷϢχοτςετͰ
    खಈςετͰ͸ؾ͖ͮʹ͍͘
    ໰୊ʹؾ͚ͮͨ

    View Slide

  48. ৼΓฦΓ

    View Slide

  49. w ϢχοτςετΛॻ͖ͳ͕ΒϦϑΝΫλͯ͠

    ࠓޙ΋ϝϯς͠΍͍͢ίʔυʹ
    w खಈςετͰͷख໭Γ͕࠷খݶ

    ʢόάΛઌग़͠Ͱݕग़ʣ
    (

    View Slide

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

    View Slide

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

    ඞཁͳσʔλ͕औΕͯͳ͍ͷʹϩάૹ৴
    ૹ৴σʔλͷऔಘ
    ϩάૹ৴˓
    ϩάૹ৴º
    ߴ଎Խ

    View Slide

  52. Ϟδϡʔϧؒͷ҉໧తͳґଘؔ܎͸

    ϢχοτςετͰ͸ؾ͖ͮʹ͍͘

    View Slide

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

    View Slide

  54. ·ͱΊ

    View Slide

  55. ·ͱΊ
    w ύϑΥʔϚϯεվળͱϦϑΝΫλϦϯά͸

    Ͱ͖Ε͹ηοτͰ
    w खಈςετͰ͸ؾ͚ͮͳ͍ෆ۩߹ʹ

    7JFXͷςετͰؾ͚ͮͨ
    w Ϣχοτςετ͚ͩͰͳ͘"TTFSUJPO΋׆༻

    View Slide

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

    View Slide