Slide 1

Slide 1 text

Copyright © 2017 eureka, Inc. All rights reserved. What we’ve done to get High Performance in our Legacy Application ϨΨγʔͳΞϓϦέʔγϣϯͷ 60fpsԽΛ໨ࢦ͢ҝʹ΍͍ͬͯΔ͜ͱ

Slide 2

Slide 2 text

Copyright © 2017 eureka, Inc. All rights reserved. 2 Introduce FVSFLB *OD 1BJSTJ04"QQMJDBUJPO&OHJOFFS ໺ྑΧϝϥϚϯ΍ͬͯ·͢ඃࣸମʹծ͑ͯΔͷͰࣸਅࡱΒΕͯԼ͍͞ @satoshin21

Slide 3

Slide 3 text

Copyright © 2017 eureka, Inc. All rights reserved. 3 Agenda 1BJSTͷ঺հͱJ04νʔϜͷ՝୊ ॲཧϑϩʔΛ௥͍΍͍͢ΞʔΩςΫνϟͷಋೖ Ϩεϙϯεͷ࠷దԽಡΈࠐΈ଎౓ߴ଎Խ ໨ࢦͤGQT$PMMFDUJPO7JFXνϡʔχϯά Ռͨͯ͠GQTͰվળͨ͠ͷ͔ʁ

Slide 4

Slide 4 text

Copyright © 2017 eureka, Inc. All rights reserved. Pairsͷ঺հ & iOSνʔϜͷ՝୊

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Copyright © 2017 eureka, Inc. All rights reserved. 6 ྺ࢙Λ࣋ͭPairs αʔϏε։࢝͸೥݄ ೥݄ʹ1BJSTGPSJ04W͕ఏڙ։࢝ ೥݄ʹϑϧεΫϥον

Slide 7

Slide 7 text

Copyright © 2017 eureka, Inc. All rights reserved. 7 2018೥ݱࡏͷ՝୊ 0CKFDUJWF$͕ࠜװΛ୲͍ͬͯΔ෦෼͕͋Δҝɺ4XJGUͷϙςϯγϟϧΛ࠷ େݶੜ͔ͤͳ͍ ػೳ௥Ճɾվળεϐʔυ্͕͕͍ͬͯΔ͕ɺϓϩμΫτ͕ͦͷεϐʔυʹ ௥͍͚͍ͭͯͳ͍ ٕज़ෛ࠴͕ஷ·ΓɺϓϩμΫτͷύϑΥʔϚϯεʹӨڹ͕ग़࢝Ί͍ͯΔ ͔Β࡞Γ௚͍͕ͨ͠ɺίετ͕ߴ͍

Slide 8

Slide 8 text

Ͳ͏ʹ͔վળ͍ͨ͠

Slide 9

Slide 9 text

͍͖ͳΓશͯΛ࡞Γม͑ΔͷͰ͸ͳ͘ શମ࠷దԽʹ޲͚ͯҰาͮͭਐΉ

Slide 10

Slide 10 text

Copyright © 2017 eureka, Inc. All rights reserved. 10 શମ࠷దͱ෦෼࠷ద શମ࠷ద΁ͷಓ͸ҰͭͰ͸ͳ͍ ෦෼తͳ࠷దԽΛߦ͍ɺͦΕΛϓϩμΫτશମʹల։͍ͯ͘͠ શମ࠷దΛݟਾ͑ͨ෦෼࠷దΛߦ͏

Slide 11

Slide 11 text

෦෼࠷దΛ͢ΔͷͰ͋Ε͹ɾɾ

Slide 12

Slide 12 text

Ϣʔβ͕ޮՌΛ࣮ײ͠΍͍͢ & ໢ཏతͳػೳ͕ଘࡏ͢Δ

Slide 13

Slide 13 text

ϢʔβΛ͕͢͞ը໘

Slide 14

Slide 14 text

Copyright © 2017 eureka, Inc. All rights reserved. 14 ͕͢͞ը໘ʹܾΊͨཧ༝ ϩάΠϯޙɺҰ൪࠷ॳʹදࣔ͞ΕΔը໘ Ϣʔβʹ࠷΋ར༻͞ΕΔը໘ͷҰͭ ϓϩμΫτ಺Ͱԣల։Մೳͳ༷ʑͳػೳ $PMMFDUJPO7JFX Ϧϩʔυɺ௥ՃಡΈࠐΈɺ༷ʑͳσʔλΛҰཡදࣔ

Slide 15

Slide 15 text

Copyright © 2017 eureka, Inc. All rights reserved. 15 ͕͢͞ը໘ͷ՝୊ ൚༻Խͷҝͷଟ૚ܧঝͰॲཧ͕௥͍ʹ͍͘ Ϣʔβͷσʔλྔ͕ଟ͍ҝɺϩʔυʹ͕͔͔࣌ؒ Δ εΫϩʔϧ࣌ʹΨλͭ͘ ฏۉdGQT J1IPOFJ04Ͱܭଌ ※ Ϣʔβը૾͸σϞ༻ʹ༻ҙͨ͠΋ͷʹͳΓ·͢

Slide 16

Slide 16 text

Copyright © 2017 eureka, Inc. All rights reserved. 16 Τ΢ϨΧ ͷ iOS/Android/Web Engineer 6*69ʹ߆Γ͕ڧ͍ 6*ψϧψϧܯ࡯͕ৗற *OTUBHSBN΍5JOEFSͳͲΠέͯΔ6*69Λ໨ࢦ͢

Slide 17

Slide 17 text

Copyright © 2017 eureka, Inc. All rights reserved. 17 ෦෼࠷దͷ໨ඪ ॲཧϑϩʔΛ௥͍΍͍͢ΞʔΩςΫνϟͷಋೖ ϢʔβͷϨεϙϯεΛ࠷దԽಡΈࠐΈͷߴ଎Խ ໨ࢦͤGQT

Slide 18

Slide 18 text

Copyright © 2017 eureka, Inc. All rights reserved. ॲཧϑϩʔΛ௥͍΍͍͢ ΞʔΩςΫνϟͷಋೖ

Slide 19

Slide 19 text

Copyright © 2017 eureka, Inc. All rights reserved. 19 ݱࡏͷ͕͢͞ը໘ 'BU7JFX$POUSPMMFS ͕͢͞ը໘Ͱ͸ͭͷ7JFX$POUSPMMFSΛܧঝ͢Δଟ૚ߏ੒

Slide 20

Slide 20 text

Copyright © 2017 eureka, Inc. All rights reserved. 20 ଟ૚ܧঝ͞ΕΔViewController "CTUSBDU 7JFX$POUSPMMFS ͕͢͞ը໘ 7JFX$POUSPMMFS "CTUSBDU 7JFX$POUSPMMFS "CTUSBDU 7JFX$POUSPMMFS "CTUSBDU 7JFX$POUSPMMFS "CTUSBDU 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS

Slide 21

Slide 21 text

Copyright © 2017 eureka, Inc. All rights reserved. 21 Redux with ReSwift 3F4XJGU3F4XJGUΛ༻͍ͨ3FEVY-JLFͳΞʔΩςΫνϟͰ࣮ݧ ୯Ұํ޲ͷॲཧϑϩʔ ঢ়ଶͷදݱɾ؅ཧɾมߋͷ੹຿͕෼͚ΒΕ͍ͯΔ ঢ়ଶΛҰͭʹू໿ ίϯϙʔωϯτΛ֦ு͠΍͍͢࡞Γ https://github.com/ReSwift/ReSwift

Slide 22

Slide 22 text

https://github.com/ReSwift/ReSwift

Slide 23

Slide 23 text

6TFS4FBSDI"DUJPO 6TFS4FBSDI 7JFX$POUSPMMFS "QQ4UPSF "QQ4UBUF 6TFS4FBSDI4UBUF "QQ3FEVDFS 6TFS4FBSDI3FEVDFS .JEEMFXBSF

Slide 24

Slide 24 text

6TFS4FBSDI"DUJPO 6TFS4FBSDI 7JFX$POUSPMMFS "QQ4UPSF "QQ4UBUF 6TFS4FBSDI4UBUF "QQ3FEVDFS 6TFS4FBSDI3FEVDFS .JEEMFXBSF

Slide 25

Slide 25 text

6TFS4FBSDI"DUJPO 6TFS4FBSDI 7JFX$POUSPMMFS "QQ4UPSF "QQ4UBUF 6TFS4FBSDI4UBUF "QQ3FEVDFS 6TFS4FBSDI3FEVDFS .JEEMFXBSF

Slide 26

Slide 26 text

6TFS4FBSDI"DUJPO 6TFS4FBSDI 7JFX$POUSPMMFS "QQ4UPSF "QQ4UBUF 6TFS4FBSDI4UBUF "QQ3FEVDFS 6TFS4FBSDI3FEVDFS .JEEMFXBSF

Slide 27

Slide 27 text

6TFS4FBSDI"DUJPO 6TFS4FBSDI 7JFX$POUSPMMFS "QQ4UPSF "QQ4UBUF 6TFS4FBSDI4UBUF "QQ3FEVDFS 6TFS4FBSDI3FEVDFS .JEEMFXBSF

Slide 28

Slide 28 text

Copyright © 2017 eureka, Inc. All rights reserved. 28 ReSwift࣮૷ ࣮ࡍͷίʔυʹ͍ͭͯ͸࣌ؒత౎߹্ׂѪ͠·͢ ޙ΄Ͳ4QFBLFS%FDLʹσΟϨΫλʔζΧοτ൛ͱͯ͠ࢿྉΛެ։͠·͢ͷ Ͱɺ͝ࢀߟʹ͍ͯͩ͘͠͞

Slide 29

Slide 29 text

Copyright © 2017 eureka, Inc. All rights reserved. 29 ReSwiftΛ༻͍ͨReduxͷӡ༻ ॲཧΛ୯Ұํ޲ʹ͢Δ͜ͱʹΑͬͯɺॲཧϑϩʔΛ௥͍΍͘͢ͳͬͨ ར༻ଆ͸ɺػೳ௥Ճ࣌ʹؾʹ͢΂͖ࣄ͕ݮͬͨ Ҏલ͸͋ΒΏΔঢ়ଶΛ͋ΒΏΔॴͰ؅ཧ͍ͯͨ͠ "DUJPO 4UBUF 3FEVDFSͱ੹຿͕෼͚ΒΕ͍ͯΔҝɺ࣮૷ऀؒͷ࢓༷ͷζ Ϩ͕ܰݮ͞Εͨ

Slide 30

Slide 30 text

Copyright © 2017 eureka, Inc. All rights reserved. ϢʔβͷϨεϙϯεΛ࠷దԽ & ಡΈࠐΈͷߴ଎Խ

Slide 31

Slide 31 text

Copyright © 2017 eureka, Inc. All rights reserved. 31 ϢʔβϨεϙϯεͷ࠷దԽ ͕͢͞ը໘ͰϦΫΤετͨ͠Ϣʔβ৘ใ͸͋ΒΏΔ৘ใΛؚΜͰ͍ͨ ֤ը໘Ͱ࢖͏ҝͷϢʔβͷεςʔτͳͲ Ϣʔβ৘ใΛੜ੒͢Δҝͷ༨ܭͳෛՙ͕αʔόαΠυʹ NTd

Slide 32

Slide 32 text

Copyright © 2017 eureka, Inc. All rights reserved. 32 ϢʔβϨεϙϯεͷ࠷దԽ ͕͢͞ը໘ͳͲɺ(SJE6*্Ͱදࣔ͢ΔϢʔβ৘ใʹඞཁ࠷௿ݶͳϨεϙϯ εΛఆٛ ϢʔβϨεϙϯεΛ൒෼ʹ εϐʔυվળ NTNT

Slide 33

Slide 33 text

Copyright © 2017 eureka, Inc. All rights reserved. 33 Ϣʔβ௥ՃಡΈࠐΈͷ࠷దԽ Ұ౓ʹԿ݅ϢʔβΛऔΓࠐΉ͔ɺϢʔβͷૢ࡞Λͳ Δ΂્͘֐͠ͳ͍MJNJU஋Λࢦఆ͍ͨ͠ ӈ͸मਖ਼લ MJNJU஋Λ୹͗͢Δͱ౎౓ಡΈࠐΈ͕ൃੜ͠ɺ௕͗͢ ΔͱϨΠΞ΢τߋ৽ʹӨڹ͢Δ ࠓͷॴ݅Λऔಘ͢Δͷ͕ྑͦ͞͏ ※ Ϣʔβը૾͸σϞ༻ʹ༻ҙͨ͠΋ͷʹͳΓ·͢

Slide 34

Slide 34 text

Copyright © 2017 eureka, Inc. All rights reserved. 34 Ϣʔβ௥ՃಡΈࠐΈͷ࠷దԽ ௥ՃಡΈࠐΈͷऔಘλΠϛϯά΋มߋ ࠓ·Ͱ͸ϖʔδ෼खલ͔ΒϦΫΤετϢʔβΛྲྀ͠ಡΈ͍ͯ͠Δ৔߹ ʹҾ͔͔ͬΓ͕͋ͬͨ dϖʔδखલ͙Β͍͔ΒϦΫΤετ͢Δͷ͕Αͦ͞͏ʁ

Slide 35

Slide 35 text

Copyright © 2017 eureka, Inc. All rights reserved. 35 ը૾ಡΈࠐΈߴ଎Խ ը૾ͷಡΈࠐΈ଎౓ͷվળ ը૾ͷಡΈࠐΈλΠϛϯάͷݟ௚͠

Slide 36

Slide 36 text

Copyright © 2017 eureka, Inc. All rights reserved. 36 ը૾ಡΈࠐΈߴ଎Խ with Nuke LFBO/VLFͷಋೖ Ұ௨Γͷػೳ͸׬උ ,JOHpTIFS౳ͱൺ΂ͯ΋ߴ଎ $BDIF΍3FRVFTUपΓͷΧελϚΠζ͕͠΍͍͢ ※ https://qiita.com/H_Crane/items/422811dfc18ae919f8a4

Slide 37

Slide 37 text

Copyright © 2017 eureka, Inc. All rights reserved. 37 ը૾ಡΈࠐΈߴ଎Խ with Nuke https://github.com/kean/Image-Frameworks-Benchmark

Slide 38

Slide 38 text

Copyright © 2017 eureka, Inc. All rights reserved. 38 ը૾ಡΈࠐΈߴ଎Խ with Nuke https://github.com/kean/Image-Frameworks-Benchmark

Slide 39

Slide 39 text

Copyright © 2017 eureka, Inc. All rights reserved. 39 ը૾ಡΈࠐΈߴ଎Խ with Nuke Nuke.loadImage( with: ImageRequest(url: url), options: ImageLoadingOptions( transition: .fadeIn(duration: 0.33) ), into: imageView) // That’s it!

Slide 40

Slide 40 text

Copyright © 2017 eureka, Inc. All rights reserved. 40 Nuke with Prefetch API J04͔Β6*$PMMFDUJPO7JFX%BUB4PVSDF1SFGFUDIJOH͕࢖͑Δ 1SFGFUDIJOH/VLF*NBHF1SFIFBUFS XJMM%JTQMBZGPS*UFN"UͰ͍ͯͨ͠ը૾ߋ৽ΛDFMM'PS*UFN"UͰߦ͏Α͏ʹ มߋ J04͔Βݺ͹ΕΔλΠϛϯά͕มΘͬͨ ͱͷ͜ͱ͚ͩͲ΋ɾɾʁ

Slide 41

Slide 41 text

Copyright © 2017 eureka, Inc. All rights reserved. 41 Prefetching + Nuke.ImagePreheater extension UserSearchViewController: UICollectionViewDataSourcePrefetching { fileprivate let preheater: Nuke.ImagePreheater func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) { DispatchQueue(label: "scene.discovery.vc.prefetch").async { [weak self] in let requests: [Nuke.ImageRequest] = indexPaths.map({..}) self?.preheater.startPreheating(with: requests) } } func collectionView(_ collectionView: UICollectionView, cancelPrefetchingForItemsAt indexPaths: [IndexPath]) { preheater.stopPreheating() } }

Slide 42

Slide 42 text

Copyright © 2017 eureka, Inc. All rights reserved. 42 Prefetching + Nuke.ImagePreheater extension UserSearchViewController: UICollectionViewDataSourcePrefetching { fileprivate let preheater: Nuke.ImagePreheater func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) { DispatchQueue(label: "scene.discovery.vc.prefetch").async { [weak self] in let requests: [Nuke.ImageRequest] = indexPaths.map({..}) self?.preheater.startPreheating(with: requests) } } func collectionView(_ collectionView: UICollectionView, cancelPrefetchingForItemsAt indexPaths: [IndexPath]) { preheater.stopPreheating() } }

Slide 43

Slide 43 text

Copyright © 2017 eureka, Inc. All rights reserved. 43 Prefetching + Nuke.ImagePreheater extension UserSearchViewController: UICollectionViewDataSourcePrefetching { fileprivate let preheater: Nuke.ImagePreheater func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) { DispatchQueue(label: "scene.discovery.vc.prefetch").async { [weak self] in let requests: [Nuke.ImageRequest] = indexPaths.map({..}) self?.preheater.startPreheating(with: requests) } } func collectionView(_ collectionView: UICollectionView, cancelPrefetchingForItemsAt indexPaths: [IndexPath]) { preheater.stopPreheating() } }

Slide 44

Slide 44 text

Copyright © 2017 eureka, Inc. All rights reserved. 44 ஫ҙ఺ 1SFGFUDI"1* දࣔ༧ఆͷ͢΂ͯͷ*OEFY1BUI͕౉͞ΕΔ༁Ͱ͸ͳ͍ DFMM'PS*UFN"U 1BJSTͷ؀ڥͰ͸΄΅XJMM%JTQMBZGPS*UFN"Uͱಉ͡λΠϛϯάͩͬͨ Կ͔͠Βͷ޻෉͕ඞཁ͔΋

Slide 45

Slide 45 text

Copyright © 2017 eureka, Inc. All rights reserved. 45 ϢʔβͷϨεϙϯε࠷దԽ & ը૾ಡΈࠐΈߴ଎Խ ࠓ·Ͱͷഒऔಘεϐʔυ͕ૣ͍ҝɺϦϑϨογϡɺ௥ՃಡΈࠐΈ࣌ͷετ ϨεΛܰݮ ը૾ΛεΫϩʔϧ࣌ʹ͙֬͢ೝͰ͖ΔͨΊɺϢʔβ͕͙͢ʹΞΫγϣϯͰ ͖ΔΑ͏ʹͳͬͨ

Slide 46

Slide 46 text

Copyright © 2017 eureka, Inc. All rights reserved. ໨ࢦͤ60fps

Slide 47

Slide 47 text

60fpsͰψϧψϧମݧΛఏڙ͍ͨ͠

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

Copyright © 2017 eureka, Inc. All rights reserved. 49 AutoLayout͸଎߈Ͱ௚͞ͳ͚Ε͹ͳΒͳ͍ ͔ͳΓޮՌ͕͋ͬͨ ମײ ͳͥ΍ͬͯͳ͔ͬͨ

Slide 50

Slide 50 text

Copyright © 2017 eureka, Inc. All rights reserved. 50 Fix AutoLayout tips ·ͣ͸ͳ͓͢΂͖$POTUSBJOUΛ൑ผ͢Δ /4-BZPVU$POTUSBJOUJEFOUJpFS 7JFX%FCVHHFS 3FWFBM

Slide 51

Slide 51 text

Copyright © 2017 eureka, Inc. All rights reserved. 51 Fix AutoLayout tips - NSLayoutConstraint.identifier /4-BZPVU$POTUSBJOUʹ͸JEFOUJpFS͕ઃఆՄೳ ίʔυ্Ͱ΋ઃఆՄ

Slide 52

Slide 52 text

Copyright © 2017 eureka, Inc. All rights reserved. 52 Fix AutoLayout tips - NSLayoutConstraint.identifier

Slide 53

Slide 53 text

Copyright © 2017 eureka, Inc. All rights reserved. 53 Fix AutoLayout tips - View Debugger

Slide 54

Slide 54 text

Copyright © 2017 eureka, Inc. All rights reserved. 54 Fix AutoLayout tips - Reveal 3FWFBMͰ΋ಉ༷ʹ/4-BZPVU$POTUSBJOU ΍7JFXΛΞυϨεͰݕࡧՄೳ յΕ੍͍ͯͨ໿ΛϚʔΫͯ͘͠ΕΔҝݟ΍ ͍͢

Slide 55

Slide 55 text

AutoLayout͕յΕͨ৔߹͸ ଎߈Ͱ௚͠·͠ΐ͏

Slide 56

Slide 56 text

Copyright © 2017 eureka, Inc. All rights reserved. 56 Color Blended Layers 7JFX -BZFS ΛॏͶͯඳը͍ͯ͠Δ෦෼ ॏͳΓ߹͏ϨΠϠʔΛൺֱ͠࠷ऴతͳग़ྗ஋Λܭࢉ ͢ΔҝɺඳըύϑΥʔϚϯεʹӨڹ͢Δ

Slide 57

Slide 57 text

Copyright © 2017 eureka, Inc. All rights reserved. 57 Color Blended Layers ֬ೝํ๏ 4JNVMBUPSͷ৔߹ .FOV$PMPS#MFOEFE-BZFSTʹνΣοΫ

Slide 58

Slide 58 text

Copyright © 2017 eureka, Inc. All rights reserved. 58 Color Blended Layers ֬ೝ ࣮ػͷ৔߹ 9DPEF 9DPEF%FCVH7JFX%FCVHHJOH3FOEFSJOH$PMPS#MFOEFE -BZFSTʹνΣοΫ

Slide 59

Slide 59 text

Copyright © 2017 eureka, Inc. All rights reserved. 59 Color Blended Layers ରࡦ - UIImageView Ͱ͖ΔݶΓCBDLHSPVOE$PMPSΛࢦఆ͢Δ ಁաը૾ΛͳΔ΂͘࢖Θͳ͍ ະಁաͷΑ͏ͳը૾Ͱ΋BMQIB஋ؚ͕·Ε͍ͯΔ ৔߹͕͋ΔͨΊ஫ҙ

Slide 60

Slide 60 text

Copyright © 2017 eureka, Inc. All rights reserved. 60 Color Blended Layers ରࡦ - UILabel Ͱ͖ΔݶΓCBDLHSPVOE$PMPSΛࢦఆ͢Δ DMJQT5P#PVOETΛUSVFʹ ೔ຊޠɾதࠃޠͳͲΛදࣔ͢Δ৔߹ɺڪΒ͘TVCMBZFS͕௥Ճ͞Ε͍ͯΔ ҝ ˞EFTDFOU஋͕ਖ਼͘͠ઃఆ͞Ε͍ͯΔTZTUFN'POUʹݶΔ

Slide 61

Slide 61 text

Copyright © 2017 eureka, Inc. All rights reserved. 61 Color Blended Layers ରࡦ - UILabel System Font + clipsToBounds HirakakuProN-W3 + clipsToBounds MFBEJOH஋Λແࢹͯ͠DMJQ͍ͯ͠Δ https://speakerdeck.com/satoshin21/uifontdescriptor?slide=8 leading஋ͳͲʹ͍ͭͯ͸ɺҎલpotatotipsͰൃදͨ͠ࢿྉΛ͝ࢀߟʹ͍ͯͩ͘͠͞

Slide 62

Slide 62 text

Copyright © 2017 eureka, Inc. All rights reserved. 62 Offscreen Rendering ؙ֯΍ӨΛεΫϦʔϯ্ʹඳը͢ΔࡍɺϨϯμϦϯάલʹલ΋ͬͯ Φϑε ΫϦʔϯͰ ॲཧΛߦ͏ ϋʔυ΢ΣΞΞΫηϥϨʔγϣϯ (16 Λ࢖༻͍ͯ͠ͳ͍ҝύϑΥʔϚ ϯε௿ԼͷҰҼͱͳΔ SBTUFSJ[F΋͢΂͖λΠϛϯάͱ͢΂͖Ͱͳ͍λΠϛϯά͕͋Δ J04Ҏ߱Ͱ͸6**NBHF7JFXͰ࠷దԽ͞Ε͍ͯΔͱ͍͏͕ᷚͩɾɾ

Slide 63

Slide 63 text

Copyright © 2017 eureka, Inc. All rights reserved. 63 Offscreen Rendering - ֬ೝํ๏ $PMPS#MFOEFE-BZFSTͱಉ͡ํࣜͰ 0⒎TDSFFO3FOEFSJOHΛ࣮ߦ͍ͯ͠ΔՕॴΛ৭ ෇͚Ͱ͖Δ

Slide 64

Slide 64 text

Copyright © 2017 eureka, Inc. All rights reserved. 64 Offscreen Rendering - ରࡦ ؙ֯༻ͷ.BTL7JFXΛ6**NBHF7JFXͷ্ʹ ৐ͤΔํࣜͰ0⒎TDSFFO3FOEFSJOHΛආ͚ͯ ͍Δ վमલ͔Βߦ͍ͬͯΔҝɺৄࡉ͸ׂѪ ฐࣾͷ ϒϩάΛࢀর͍ͯͩ͘͠͞ https://medium.com/eureka-engineering/iosͷϋΠύϑΥʔϚϯεͳcorner-rounding-strategy-88a43641b554

Slide 65

Slide 65 text

Copyright © 2017 eureka, Inc. All rights reserved. 65 ࠩ෼ߋ৽ ݱࡏ͸௥ՃಡΈࠐΈɺ1VMMUP3FGSFTI͢Δͨͼʹ DPMMFDUJPO7JFXSFMPBE%BUB ΛݺΜͰ͍ͨ SFMPBE%BUB ΛݺͿ͜ͱͰෆඞཁͳWJTJCMF$FMMTͷߋ৽͕࣮ߦ͞ΕΔ

Slide 66

Slide 66 text

Copyright © 2017 eureka, Inc. All rights reserved. 66 ࠩ෼ߋ৽ - Libraries *OTUBHSBN*(-JTU,JU TFDUJPOϕʔεͷࠩ෼ൺֱ 3Y4XJGU$PNNVOJUZ3Y%BUB4PVSDFT KqJOUFS%XJ⒎U NVVLJJ%BUB4PVSDFT

Slide 67

Slide 67 text

Copyright © 2017 eureka, Inc. All rights reserved. 67 muukii/DataSources NVVLJJ%BUB4PVSDFT *(-JTU,JUͳͲͷࠩ෼நग़ΞϧΰϦζϜΛࢀߟʹ࡞ΒΕ͍ͯΔ λΠϓηʔϑ ࠩ෼நग़ʹಛԽͨ͠γϯϓϧͳ࢓૊Έطଘͷ࢓૊Έͱ਌࿨ੑ͕ߴ͍ ฐࣾϝϯόʔ NVVLJJ ͕࡞͍ͬͯΔҝɺ࣭໰͕͋ͬͨΒ͙͢ฉ͚Δ

Slide 68

Slide 68 text

Copyright © 2017 eureka, Inc. All rights reserved. 68 muukii/DataSources - ModelΛఆٛ enum Item { case user(User) case banner(Banner) case feature(Feature) // Ϩίϝϯυ࿮ͷΑ͏ͳ΋ͷ }

Slide 69

Slide 69 text

Copyright © 2017 eureka, Inc. All rights reserved. 69 muukii/DataSources - ModelΛఆٛ import DataSources extension Item: DataSources.Diffable { typealias Identifier = String var diffIdentifier: String { switch self { case .user(let user): return user.diffIdentifier case .banner(let banner): return banner.diffIdentifier case .feature(let feature): return feature.diffIdentifier } } }

Slide 70

Slide 70 text

Copyright © 2017 eureka, Inc. All rights reserved. 70 muukii/DataSources - ModelΛఆٛ import DataSources extension Item: DataSources.Diffable { typealias Identifier = String var diffIdentifier: String { switch self { case .user(let user): return user.diffIdentifier case .banner(let banner): return banner.diffIdentifier case .feature(let feature): return feature.diffIdentifier } } }

Slide 71

Slide 71 text

Copyright © 2017 eureka, Inc. All rights reserved. 71 muukii/DataSources - ModelΛఆٛ import DataSources extension Item: DataSources.Diffable { typealias Identifier = String var diffIdentifier: String { switch self { case .user(let user): return user.diffIdentifier case .banner(let banner): return banner.diffIdentifier case .feature(let feature): return feature.diffIdentifier } } }

Slide 72

Slide 72 text

Copyright © 2017 eureka, Inc. All rights reserved. 72 muukii/DataSources - SectionControllerΛఆٛ final class UserSearchViewController: UIViewController, StoreSubscriber { fileprivate lazy var sectionController: DataSources.SectionDataController = .init( adapter: .init(collectionView: self.collectionView), displayingSection: 0, isEqual: { a, b in a.diffIdentifier == b.diffIdentifier } ) }

Slide 73

Slide 73 text

Copyright © 2017 eureka, Inc. All rights reserved. 73 muukii/DataSources - SectionControllerΛఆٛ final class UserSearchViewController: UIViewController, StoreSubscriber { fileprivate lazy var sectionController: DataSources.SectionDataController = .init( adapter: .init(collectionView: self.collectionView), displayingSection: 0, isEqual: { a, b in a.diffIdentifier == b.diffIdentifier } ) }

Slide 74

Slide 74 text

Copyright © 2017 eureka, Inc. All rights reserved. 74 muukii/DataSources - SectionControllerΛఆٛ final class UserSearchViewController: UIViewController, StoreSubscriber { fileprivate lazy var sectionController: DataSources.SectionDataController = .init( adapter: .init(collectionView: self.collectionView), displayingSection: 0, isEqual: { a, b in a.diffIdentifier == b.diffIdentifier } ) }

Slide 75

Slide 75 text

Copyright © 2017 eureka, Inc. All rights reserved. 75 muukii/DataSources - SectionControllerΛఆٛ final class UserSearchViewController: UIViewController, StoreSubscriber { func newState(state: State) { switch state.loadingState { case .loaded(let items): self.sectionController.update( items: items, updateMode: .partial(animated: true), completion: { Log.info("updated") }) } } }

Slide 76

Slide 76 text

Copyright © 2017 eureka, Inc. All rights reserved. 76 muukii/DataSources - SectionControllerΛఆٛ final class UserSearchViewController: UIViewController, StoreSubscriber { func newState(state: State) { switch state.loadingState { case .loaded(let items): self.sectionController.update( items: items, updateMode: .partial(animated: true), completion: { Log.info("updated") }) } } }

Slide 77

Slide 77 text

Copyright © 2017 eureka, Inc. All rights reserved. 77 muukii/DataSources - SectionControllerΛఆٛ final class UserSearchViewController: UIViewController, StoreSubscriber { func newState(state: State) { switch state.loadingState { case .loaded(let items): self.sectionController.update( items: items, updateMode: .partial(animated: true), completion: { Log.info("updated") }) } } }

Slide 78

Slide 78 text

60fpsʹ͚ۙͮͨͷ͔ʁ

Slide 79

Slide 79 text

ߋ৽લ ߋ৽ޙ iPhone 5(MD297J/A) iOS 10.3.3 ※ Ϣʔβը૾͸σϞ༻ʹ༻ҙͨ͠΋ͷʹͳΓ·͢

Slide 80

Slide 80 text

ߋ৽લ ߋ৽ޙ 36fps 60fps 55fps iPhone 5(MD297J/A) iOS 10.3.3 ※ Ϣʔβը૾͸σϞ༻ʹ༻ҙͨ͠΋ͷʹͳΓ·͢

Slide 81

Slide 81 text

Copyright © 2017 eureka, Inc. All rights reserved. ·ͱΊ

Slide 82

Slide 82 text

Copyright © 2017 eureka, Inc. All rights reserved. 82 վળ݁Ռ ਓؒʹ͸ཧղ͕೉͔ͬͨ͠ॲཧϑϩʔΛ3FEVYΛಋೖ͢Δ͜ͱͰΘ͔Γ΍ ͘͢ఆٛ͢Δ͜ͱ͕Ͱ͖ͨ ৮͍ͬͯͯ৺஍͍͍6*69Λఏڙ͢Δϕʔε͕Ͱ͖ͨ GQTΛҰͭͷࢦඪͱ͢Δ͜ͱͰɺ6*69޲্ΛఆྔԽ͢Δ͜ͱ͕Ͱ͖ͨ

Slide 83

Slide 83 text

Copyright © 2017 eureka, Inc. All rights reserved. 83 օ͞Μʹ͓ئ͍ Τ΢ϨΧϒʔεΛ༻ҙ͍ͯ͠·͢ʂ ΋͠ɺύϑΥʔϚϯενϡʔχϯάʹؔͯ͠ڵຯ͕͋Δํɺʮ͜ΕΛվળ ͨ͠ΒύϑΥʔϚϯε޲্ͨ͠ΑʂʯͳͲͷϊ΢ϋ΢͕͋ΔํͳͲ͍Βͬ ͠Ό͍·ͨ͠Βɺੋඇͱ΋৘ใަ׵͠·͠ΐ͏

Slide 84

Slide 84 text

Thank you IUUQTXXXOBTBHPWNJTTJPO@QBHFT/11OFXTFBSUIBUOJHIUIUNM