Slide 1

Slide 1 text

ϚονϯάΞϓϦʹ͖ͭ·ͱ͏ঢ়ଶ؅ཧͷͭΒ͞ ߴڮ ༏հ @corin8823 גࣜձࣾτϧς / Developer 2017.10.18 CA.SWIFT #4

Slide 2

Slide 2 text

ߴڮ ༏հ yusuke takahashi גࣜձࣾτϧς / Developer 2013೥౓৽ଔೖࣾ corin8823 @corin8823 ࣗݾ঺հ

Slide 3

Slide 3 text

IUUQTTXFFUUPSUFDPN ࡀҎ্ݶఆ

Slide 4

Slide 4 text

ϚονϯάΞϓϦʹ͖ͭ·ͱ͏ ঢ়ଶ؅ཧͷͭΒ͞

Slide 5

Slide 5 text

7JFX$POUSPMMFSΛ ލ͍ͩঢ়ଶ؅ཧ

Slide 6

Slide 6 text

7JFX$POUSPMMFSΛލ͍ͩঢ়ଶ؅ཧ ౤ߘ಺༰ ະಡطಡ ભҠ

Slide 7

Slide 7 text

w ৄࡉͰʮ͍͍Ͷʯͨ࣌͠ʹҰཡ΁ͷ൓ө w "λϒͰʮ͍͍Ͷʯͨ࣌͠ʹ#λϒͰͷ൓ө w ৄࡉͰ࡟আͨ࣌͠ʹҰཡ͔Β΋ফ͢ w ౳ʑ 7JFX$POUSPMMFSΛލ͍ͩঢ়ଶ؅ཧ

Slide 8

Slide 8 text

લճͷొஃࢿྉ

Slide 9

Slide 9 text

IUUQTGBDFCPPLHJUIVCJPqVYEPDTJOEFQUIPWFSWJFXIUNMDPOUFOU 'MVY

Slide 10

Slide 10 text

7JFX$POUSPMMFSΛލ͍ͩঢ়ଶ؅ཧ ౤ߘ಺༰ ະಡطಡ ભҠ

Slide 11

Slide 11 text

final class TopAction { enum Item { case load case error } private let dispatcher: Dispatcher init(dispatcher: Dispatcher = .shared) { self.dispatcher = dispatcher } func loadItem() { let req = API.ItemRequest() Session.send(req) { result in switch result { case .success(let items): self.dispatcher.dispatch(obj: items, key: Item.load) case .failure(let error): self.dispatcher.dispatch(obj: error, key: Item.error) } } } }

Slide 12

Slide 12 text

final class TopStore { private(set) var items = Variable<[Item]>([]) private(set) var error = PublishSubject() init(dispatcher: Dispatcher = .shared) { dispatcher.register(observer: self, key: TopAction.Item.load) { [weak self] (items: [Item]) in self?.items.value = items } dispatcher.register(observer: self, key: TopAction.Item.error) { [weak self] (error: Error) in self?.error.on(.next(error)) } } }

Slide 13

Slide 13 text

final class TopViewController: UIViewController { @IBOutlet weak var tableView: UITableView! private let store = TopStore() private let disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() self.store.error .bind { _ in // error handling } .disposed(by: self.disposeBag) self.store.items .asObservable() .bind { [weak self] _ in self?.tableView.reloadData() } .disposed(by: self.disposeBag) TopAction().loadItem() } }

Slide 14

Slide 14 text

7JFX$POUSPMMFSΛލ͍ͩঢ়ଶ؅ཧ ౤ߘ಺༰ ະಡطಡ ભҠ

Slide 15

Slide 15 text

final class TopDetailAction { enum ItemDetail { case update case error } func update(itemId: Int64) { let req = API.UpdateItemRequest(itemId: id) Session.send(req) { result in switch result { case .success(let item): self.dispatcher.dispatch(obj: item, key: ItemDetail.update) 
 case .failure(let error): self.dispatcher.dispatch(obj: error, key: update.error) } } } }

Slide 16

Slide 16 text

final class TopDetailAction { enum ItemDetail { case update case error } enum Item { case update } func update(itemId: Int64) { let req = API.UpdateItemRequest(itemId: id) Session.send(req) { result in switch result { case .success(let item): self.dispatcher.dispatch(obj: item, key: ItemDetail.update) self.dispatcher.dispatch(obj: item, key: Item.update) 
 case .failure(let error): self.dispatcher.dispatch(obj: error, key: update.error) } } } }

Slide 17

Slide 17 text

final class TopStore { private(set) var items = Variable<[Item]>([]) private(set) var error = PublishSubject() init(dispatcher: Dispatcher = .shared) { dispatcher.register(observer: self, key: TopAction.Item.load) { [weak self] (items: [Item]) in self?.items.value = items } dispatcher.register(observer: self, key: TopAction.Item.error) { [weak self] (error: Error) in self?.error.on(.next(error)) } dispatcher.register(observer: self, key: TopDetailAction.Item.update) { [weak self] (item: Item) in
 if let i = self?.items.value.findFirstIndex ({ $0.id == item.id }) { self?.items.value[i] = match } } } }

Slide 18

Slide 18 text

final class TopViewController: UIViewController { @IBOutlet weak var tableView: UITableView! private let store = TopStore() private let disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() self.store.error .bind { _ in // error handling } .disposed(by: self.disposeBag) self.store.items .asObservable() .bind { [weak self] _ in self?.tableView.reloadData() } .disposed(by: self.disposeBag) TopAction().loadItem() } }

Slide 19

Slide 19 text

7JFX$POUSPMMFSΛލ͍ͩঢ়ଶ؅ཧ 5PQ7JFX$POUSPMMFS 5PQ4UPSF 5PQ"DUJPO %JTQBUDIFS

Slide 20

Slide 20 text

7JFX$POUSPMMFSΛލ͍ͩঢ়ଶ؅ཧ 5PQ%FUBJM7JFX$POUSPMMFS 5PQ%FUBJM4UPSF 5PQ%FUBJM"DUJPO %JTQBUDIFS

Slide 21

Slide 21 text

7JFX$POUSPMMFSΛލ͍ͩঢ়ଶ؅ཧ 5PQ7JFX$POUSPMMFS 5PQ%FUBJM7JFX$POUSPMMFS 5PQ4UPSF 5PQ%FUBJM4UPSF 5PQ%FUBJM"DUJPO %JTQBUDIFS

Slide 22

Slide 22 text

౤ߘͷঝೝ

Slide 23

Slide 23 text

౤ߘͷঝೝ Ϣʔβʔ ঝೝऀ αʔόʔ ౤ߘ ؅ཧը໘

Slide 24

Slide 24 text

౤ߘͷঝೝ Ϣʔβʔ ঝೝऀ αʔόʔ ঢ়ଶ൓ө ঝೝ

Slide 25

Slide 25 text

w ೥ྸ֬ೝ w χοΫωʔϜ w ࣸਅ౤ߘ w ࠷ॳͷϝοηʔδ w ঁੑ͔ΒͷΫνίϛ ঝೝ͕ඞཁͳ౤ߘ

Slide 26

Slide 26 text

౤ߘͷঝೝ Ϣʔβʔ ঝೝऀ αʔόʔ ঢ়ଶ൓ө ঝೝ

Slide 27

Slide 27 text

w Ͱ͖Δ͚ͩૣ͘ঝೝΛ఻͍͑ͨ w ৭ʑͳঝೝ͕͋Δ ࠓޙ΋૿͑ΔՄೳੑ w ঝೝऔಘ"1*ΛϙʔϦϯά ʀТʀʆ ŲƄƂŕ w 8FC4PDLFUுΔʁ w ΤϯδχΞ΋࠷খݶͰ ౤ߘͷঝೝͷ࿦఺

Slide 28

Slide 28 text

'JSFCBTF3FBMUJNF%BUBCBTF IUUQTpSFCBTFHPPHMFDPNQSPEVDUTSFBMUJNFEBUBCBTF

Slide 29

Slide 29 text

IUUQTpSFCBTFHPPHMFDPN 'JSFCBTF

Slide 30

Slide 30 text

w ϦΞϧλΠϜ w ΦϑϥΠϯ w ΫϥΠΞϯτ୺຤͔ΒΞΫηεՄೳ 'JSFCBTF3FBMUJNF%BUBCBTF IUUQTpSFCBTFHPPHMFDPNEPDTEBUBCBTF

Slide 31

Slide 31 text

౤ߘͷঝೝϑϩʔ Ϣʔβʔ ঝೝऀ αʔόʔ ঢ়ଶ൓ө ঝೝ 4ZOD

Slide 32

Slide 32 text

w VTFST\VTFS@JEతͳ^CBEHF ۩ମྫ class Badge { var notification: Int var match: Int var message: Int } w OPUJpDBUJPO͕૿͑ͨΒ࠶౓ࣗ෼Λऔಘ w NBUDI͕૿͑ͨΒϚονͷϦετΛߋ৽ w NFTTBHF͕૿͑ͨΒόοδΛ͚ͭͯɾɾ

Slide 33

Slide 33 text

'JSFCBTF3FBMUJNF%BUBCBTFΛ࢖ͬͨ౤ߘͷঝೝ Ϣʔβʔ αʔόʔ 4ZOD ঝೝ

Slide 34

Slide 34 text

'JSFCBTF3FBMUJNF%BUBCBTFΛ࢖ͬͨ౤ߘͷঝೝ Ϣʔβʔ αʔόʔ όοδΛΠϯΫϦϝϯτ 4ZOD ঝೝ

Slide 35

Slide 35 text

'JSFCBTF3FBMUJNF%BUBCBTFΛ࢖ͬͨ౤ߘͷঝೝ Ϣʔβʔ αʔόʔ όοδΛΠϯΫϦϝϯτ 4ZOD ঝೝ "1*ίʔϧ

Slide 36

Slide 36 text

"1*Λୟ͘τϦΨʔ͚ͩΛ 'JSFCBTF3FBMUJNF%BUBCBTFʹ

Slide 37

Slide 37 text

w ೔ճ͔͠࢖͑ͳ͍ػೳͷ೔෇Λ͍ΕͨΓ w "1*ୟ͘લʹ7JFXʹ൓ө͍ͤͨ͞ w "1*ୟ͘·Ͱ΋ͳ͍ ౤ߘͷঝೝҎ֎ʹ΋

Slide 38

Slide 38 text

w ೔ճ͔͠࢖͑ͳ͍ػೳͷ೔෇Λ͍ΕͨΓ w "1*ୟ͘લʹ7JFXʹ൓ө͍ͤͨ͞ w "1*ୟ͘·Ͱ΋ͳ͍ ౤ߘͷঝೝҎ֎ʹ΋ w ΞΠςϜͷ਺౳΋ಉظͨ͘͠ͳΔ

Slide 39

Slide 39 text

w ೔ճ͔͠࢖͑ͳ͍ػೳͷ೔෇Λ͍ΕͨΓ w "1*ୟ͘લʹ7JFXʹ൓ө͍ͤͨ͞ w "1*ୟ͘·Ͱ΋ͳ͍ ౤ߘͷঝೝҎ֎ʹ΋ w ΞΠςϜͷ਺౳΋ಉظͨ͘͠ͳΔ w ͋Ε΋͜Ε΋ɻɻɻ IUUQGVSBOEPOQJHHJUIVCJPGQJH@TBNQMFIPCCZCBE@TQJSBM

Slide 40

Slide 40 text

·ͱΊ

Slide 41

Slide 41 text

·ͱΊ ViewControllerΛލ͍ͩঢ়ଶ؅ཧ Firebase Realtime DatabaseΛ࢖ͬͨ౤ߘͷঝೝ

Slide 42

Slide 42 text

7JFX$POUSPMMFSΛލ͍ͩঢ়ଶ؅ཧ 5PQ7JFX$POUSPMMFS 5PQ%FUBJM7JFX$POUSPMMFS 5PQ4UPSF 5PQ%FUBJM4UPSF 5PQ%FUBJM"DUJPO %JTQBUDIFS

Slide 43

Slide 43 text

'JSFCBTF3FBMUJNF%BUBCBTFΛ࢖ͬͨ౤ߘͷঝೝ Ϣʔβʔ ঝೝऀ αʔόʔ ঢ়ଶ൓ө ঝೝ 4ZOD

Slide 44

Slide 44 text

5)"/,:06