Slide 1

Slide 1 text

MVVM for iOS MVVM for iOS @laiso @laiso 03/12/2014 03/12/2014 potatotips#5(at COOKPAD) potatotips#5(at COOKPAD)

Slide 2

Slide 2 text

laiso is NOT laiso is NOT ແ৬ ແ৬ http://lai.so/

Slide 3

Slide 3 text

ΤϯλʔϓϥΠζ ΤϯλʔϓϥΠζObjective-C Objective-C ͷੈքͱ͸ ͷੈքͱ͸

Slide 4

Slide 4 text

มߋ͕πϥ͍ มߋ͕πϥ͍iOS iOSΞϓϦέʔ ΞϓϦέʔ γϣϯ γϣϯ Fat & Massive ViewController God object, Singleton UI testing is very hard

Slide 5

Slide 5 text

มߋʹཱͪ޲͔͏ มߋʹཱͪ޲͔͏iOS iOSΞϓϦ ΞϓϦ έʔγϣϯ έʔγϣϯ OSΞοϓσʔτʹΑΓΫϥΠΞϯτͷ؀ڥ͕ͲΜͲΜߋ ৽͞ΕͯΏ͘ ϢʔβʔαΠυͰಈ͘ͿΜݖݶ΍Өڹ͕େ͖͘มߋʹϦε Ϋ͕͋Δ(඼࣭ཁٻ͕ߴ͍) ωΠςΟϒUIͷมߋ͸HTML+JavaScriptͳͲΑΓॏ͘ͳΓ ͕ͪ

Slide 6

Slide 6 text

ઃܭվળ ઃܭվળ ίʔυΛཧղ͠΍͍ͨ͘͢͠ ςετΛॻ͖΍͍ͨ͘͢͠ มߋʹڧ͘ͳΓɺߴ଎ʹ։ൃ͍ͨ͠

Slide 7

Slide 7 text

MVVM MVVM (Model View ViewModel) (Model View ViewModel)

Slide 8

Slide 8 text

MVVM MVVM Windows / .NET WPF Silverlight JavaScript Framework AngularJS KnockoutJS

Slide 9

Slide 9 text

MVC MVC MVVM MVVM

Slide 10

Slide 10 text

Cocoa vs MVVM Cocoa vs MVVM ϓϥοτϑΥʔϜຖʹMVCͷߟ͑ํ͸ҧ͏ (Rails,Cocoa,Smalltalk) Controller != ViewController MVVM View == View+ViewController

Slide 11

Slide 11 text

ViewController ViewController Ϗϡʔͷίϯτϩʔϥʔ ΞϓϦέʔγϣϯ/Ϟδϡʔϧ"ͷ"ίϯτϩʔϥʔͰ͸ͳ ͍ ର৅ͷϏϡʔΛอ໋࣋ͯ͠ྩ͢Δ

Slide 12

Slide 12 text

ViewModel ViewModel View-ModelɻϏϡʔͷͨΊͷϞσϧ σʔλόΠϯσΟϯάͷ࢓૊ΈͰσʔλΛϏϡʔͱ઀ଓ Ϗϡʔͳ͠Ͱ΋ΠϯλʔϑΣΠεΛૢ࡞Ͱ͖Δ

Slide 13

Slide 13 text

MVVM MVVMͷத৺ͱͳΔߟ͑ํ ͷத৺ͱͳΔߟ͑ํ એݴతͳViewςϯϓϨʔτ σʔλόΠϯσΟϯά

Slide 14

Slide 14 text

Storyboard(IB) Storyboard(IB) એݴతͳViewςϯϓϨʔτ Storyboard != View த਎͸Ξοϓϧͷಠࣗن֨ͷXMLςΩετϑΝΠϧ Xcode͕GUIσβΠϯπʔϧͱͯ͠ղऍ͢Δɻ ຊ෼͸ϏϡʔΛએݴͯ͠ΠϕϯτΛ઀ଓ͢Δ͜ͱ ʮUIύʔπΛը໘ʹදࣔͤ͞ΔͨΊͷπʔϧʯҎ্ͷ ҙຯ߹͍͕͋Δ

Slide 15

Slide 15 text

σʔλόΠϯσΟϯά σʔλόΠϯσΟϯά = Co‐ = Co‐ coa coaόΠϯσΟϯά όΠϯσΟϯά? ? Mac OS X޲͚ͷσʔλόΠϯσΟϯάػߏ iOSʹ͸དྷͯͳ͍ see "Cocoa Bindings Programming Topics" http://news.mynavi.jp/special/2005/cocoamvc/menu.html

Slide 16

Slide 16 text

σʔλόΠϯσΟϯά σʔλόΠϯσΟϯά = Re‐ = Re‐ activeCocoa activeCocoa https://github.com/ReactiveCocoa/ReactiveCocoa

Slide 17

Slide 17 text

ReactiveCocoa ReactiveCocoa Mac/iOSͰϦΞΫςΟϒϓϩάϥϛϯάΛ࣮ݱ͢Δҝͷϥ ΠϒϥϦ ؔ਺ܕϓϩάϥϛϯά෩ͷݴޠ಺DSL

Slide 18

Slide 18 text

ReactiveCocoa ReactiveCocoaͱ ͱGitHub GitHub GitHubࣾͷਓୡΛϝΠϯʹ։ൃ͞Ε͍ͯΔ GitHub͕Windows൛ΞϓϦέʔγϣϯΛ։ൃ͠ग़ͨ͋͠ ͨΓ͔Β׆ൃʹ GitHubʹC#/.NETܥͷ࣮ྗऀ͕͍ΔɻXamarin/Mono΋΍ ͬͯΔͦ͏ GitHubͷMacΞϓϦ͸ReactiveCocoaΛ࢖ͬͯMVVMΛ࣮ ݱ͍ͯ͠Δ

Slide 19

Slide 19 text

ReactiveCocoa ReactiveCocoa มߋΛγάφϧͱ͍͏ΦϒδΣΫτͰදݱͰ͖ΔͷͰɺ ViewModel͸ViewͷৄࡉΛ஌Δඞཁ͕ͳ͍ ViewModelΛର৅ʹςετ͕ॻ͚Δ

Slide 20

Slide 20 text

RVMViewModel RVMViewModel ReactiveCocoa/ReactiveViewModel ಛఆͷγάφϧͷΠϯλʔϑΣΠεΛఆٛͨ͠ϕʔεΫϥ ε ViewModelͰܧঝͯ͠࢖͏

Slide 21

Slide 21 text

ViewModel ViewModelΛ࢓ࠐΉ Λ࢓ࠐΉ ViewControllerͷॳظԽ࣌ʹ // TipsListViewController - (id)init { // ... self.viewModel = [[TipsListViewModel alloc] init]; return self; }

Slide 22

Slide 22 text

ViewModel ViewModelΛ࢓ࠐΉ Λ࢓ࠐΉ StoryboardͷγʔέϯεͰInject // TipsListViewController - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"showDetail"]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; TipsDetailViewController *viewController = segue.destinationViewController; // ભҠઌͷViewModelΛॳظԽͯ͠ฦ͢ viewController.viewModel = [self.viewModel detailViewModelForIndexPath:indexPath]; } }

Slide 23

Slide 23 text

ViewModel ViewModelͷ୯ମςετ ͷ୯ମςετ it (@"ViewModelͷςετ", ^{ TipsDetailViewModel *viewModel = [[TipsDetailViewModel alloc] initWithModel:tips] expect(viewModel.title).to.equal(@"MVVM for iOS"); expect(viewModel.subTitle).to.equal(@""); expect(viewModel.author).to.equal(@"laiso"); });

Slide 24

Slide 24 text

Pros Pros UIͱϩδοΫͷ෼཭ ςετ͠΍͘͢ͳΔ ࠶ར༻͠΍͘͢ͳΔ ϦΞΫςΟϒUIԽͰͷԠ౴ੑ޲্

Slide 25

Slide 25 text

Cons Cons هड़ྔ͕૿͑Δ ReactiveCocoaͷޠኮΛशಘ͢Δඞཁ͕͋Δ ࣮ݧతͰ࣮ફ͢Δͷ͕೉͍͠ ϑϨʔϜϫʔΫଆͷڧ੍ྗ͸ͳ͍ͷͰͨͩ৑௕ʹͳͬ ͯΠϚΠνͳײ͡ͰऴΘΔՄೳੑ΋͋Δ UIʹର͢Δςετ͸ΧόʔͰ͖ͳ͍

Slide 26

Slide 26 text

͜Ε͔Β ͜Ε͔Β 1. ෳ਺ͷ։ൃऀ͕͔͔ΘΔΑ͏ͳෳࡶͰن໛ͷେ͖ͳΞϓϦ έʔγϣϯΛ͏·͘։ൃͰ͖ΔΑ͏ʹ͢Δ 2. ςετͰอޢͰ͖ΔൣғΛ૿΍ͯ͠ϦϑΝΫλϦϯάͰί ʔυͷ෗ഊΛ๷͗ߴ଎ʹϦϦʔεͰ͖ΔΑ͏ʹ͢Δ 3. ํ๏࿦ͷಋೖͰ͸ͳ͘എܠͷ՝୊ʹؔ৺Λ࣋ͪࣗ෼ͨͪͰ ߟ͑Δ͜ͱͰվળ͍ͯ͘͠

Slide 27

Slide 27 text

ࢀߟࢿྉ ࢀߟࢿྉ Code Reuse with MVVM Model-View-ViewModel for iOS | Teehan+Lax ReactiveCocoa/Documentation/FrameworkOverview.md at master · ReactiveCocoa/ReactiveCocoa GUI Architectures

Slide 28

Slide 28 text

Functional Reactive Program‐ Functional Reactive Program‐ ming on iOS ming on iOS https://leanpub.com/iosfrp

Slide 29

Slide 29 text

Xamarin.iOS Xamarin.iOS C#޲͚ͷMVVMαϙʔτϥΠϒϥϦ https://github.com/MvvmCross/MvvmCross https://github.com/reactiveui/ReactiveUI

Slide 30

Slide 30 text

Thank You Thank You