纹理最佳实践5

MVVM활용한材质纹理应用程序만들기

서론

图1〜4편까로는를를를본적인본적인본적인본적인뤘고뤘고뤘고뤘고뤘고뤘고뤘고뤘고뤘고본적인본적인본적인본적인본적인본적인본적인본적인본적인듭니듭니듭니듭니듭니듭니。

이번에높높매우매우때문에팅을팅을하신하신하신한한한한한듭니듭니듭니듭니듭니듭니듭니듭니듭니。。。。。。。。。。

  • RxSwift / RxCocoa Link이해(链接)
  • Texture UI发布(AsyncDisplayKit)
  • 型号,视图해이해,기존MVC패턴에패턴에

MVC와MVVM

우선MVVM존에에에존존MVC패턴을말씀드리자면

MVC패턴이Model ?,模型—视图—控制器의로약자리케이션을가지의로역할다。 应用程序应用程序控制器控制器模型数据视图,视图视图菜单视图。

iOS장가장기본적인이며,많이쓰이기도다。 下载,下载iOS代理到Google Play上的应用程序。

왜이,MVVM패턴이탄생하게된?。 죠다똑같은케리케이션인데죠이죠。

MVC在UI的다。。。上케케케케케케케케면면면면뿐더러뿐더러。

MVC模型模型视图控制器控制器控制器控制器控制器控制器控制器控制器控制器지게다。

따라서查看模型것이것이MVVM패턴입니다。

MVVM模型— ViewModel —查看로있습니다。 ViewModel的下载,ViewModel的ViewModel的下载,ViewModel的下载,ViewModel的下载。 ViewModel模型在模型中的使用。

iOS는ViewController때문에기模型— ViewModel View View(ViewController)이되겠습니다。

면따라서어플되케에에에에에에에에에에에에에에같습니다。다

에MVVM이랑MVC했습니다만른다고감사참조하시면다하겠습니 (이번스포지취지는기아니기비교할려는게이니다。)

已下载MVVM,Texture和Github存储库列表。 준비물이필요하겠죠? 。사항은같습니다。

  • Github存储库API(https://api.github.com/repositories)
  • Xcode
  • Cocoapod(Texture,RxSwift / RxCocoa 4.x이상,AlamoFire)

분들은https://github.com/GeekTree0101/RxMVVM-Texture

위의Github存储库를克隆되겠습니다。 (星级눌려주시면사하겠습니다。ㅎ)

迅速下载Swift4.x。

模特과视图를보자!

우선,개략적으로개략적으알아보도록하겠습니다。

在ViewModel中查看ViewModel,在ModelUp中查看模型,在ModelProvider中获取模型。

Model Provider的模型Model和Array的模型。

View저희가만들를넣었고넣었고。나타냈습니다나타냈습니다

。사진과이같리케이케이동작하게다。

를를를를했으나를1 1 1 1 1생략하도록생략하도록생략하도록생략하도록。

https://github.com/GeekTree0101/RxMVVM-Texture/blob/master/RxMVVM%2BTexture/nodes/RepositoryListCellNode.swift

快速模型4. Swift在Model Mapper和Mantle中的应用。 (짞짞짞)

https://github.com/GeekTree0101/RxMVVM-Texture/blob/master/RxMVVM%2BTexture/models/Repository.swift

在Alamofire的网络服务中,使用Github API在JSON中下载模型。

列表列表中的ASCellNode和ASTableNode都在ViewController中。

模型提供者

이만들었제가편의상지만,개발자이할다。

의동일한유는동일한동일한동일한의의의의의의동일한동일한동일한。。。。。。。。。。。。。。。。。

使用UINavigationController和ViewController Stack,请使用ViewController Stack和ViewController Stack。

여기를스소스있으며있으며있으며있으며각각각각자면자면자면자면

 私有静态let repoRelay = BehaviorRelay (值:[:]) 
 私人静态让队列= DispatchQueue(标签:“ RepoProvider.RxMVVMTexture.com”,qos:.utility) 
 私有静态let repoObservable = repoRelay.asObservable().subscribeOn(SerialDispatchQueueScheduler(queue:queue,internalSerialQueueName:UUID()。uuidString))。share(重播:1,范围:.whileConnected) 

repoRelay(BehaviorRelay) :中继RxSwift的产品,BehaviorSubject,错误的错误,完全的错误,终止的错误和错误。 不再支持BehaviorSubject나Behavior보Relay를사용하였습니다。 字典,词典,[Int:(repo:存储库,count:Int,updatedAt:Date)]여기서键값은Model의唯一值주로标识符루며다루며repo는Model객체를가리키며,count는模型模型ViewModel模型库。 0일시에는일시에는용일시에는상없없때문에发行词典해당제다。 마지막으로更新了At은model이업데이트된정보를Date형태로다루게다。 자세한건方法자세한건다루겠습니다。

repoObservable标记的实用程序队列 :提供者Model的模型,MainThread的实用程序QoS的DispatchQueue的批注。 (对标签进行队列repoObservable용합니사용합니다。)

订阅,序列化,共享,重播,照片,照片和照片。

今日的RxJava技巧-共享,发布,引用计数和所有Jazz
最初将本文发布在Wedding Party技术博客 blog.kaush.co上

여러리고方法들이있습니다。

 静态函数addAndUpdate(_ repo:存储库){...} 
 静态函数更新(_ repo:存储库){...} 
 静态函数保留(id:Int){...} 
 静态函数发布(id:Int){...} 
 静态函数仓库(id:Int)->存储库?  {...} 
 静态函数observable(id:Int)-> Observable  {...} 

addAndUpdate :模型提供程序的下载。 在Model中添加addAndUpdate,在RepoRelay中使用Model,然后在count中使用update进行更新。

更新 :repoRelay가다를특정型号를로업데이트다。 使用ViewModel和Model进行属性分配。

保留/发布 :保留模型/模型视图模型到模型/模型/模型/模型/模型/模型/模型/模型型号repoRelay로거하도록있습니다。

repo :模型标识符在模型上repoRelayRelayRepository。 标识符,模型,访问,变异和对象。

可观察的:ViewModel的视图模型,Identifier的模型模型和Observer的视图。

ModelProvider的服务提供商。

在Model Provider中查看ViewModel。

视图模型

의ViewModel도록보도록다。 https://github.com/GeekTree0101/RxMVVM-Texture/blob/master/RxMVVM%2BTexture/viewmodels/RepositoryViewModel.swift

 类RepositoryViewModel { 
  // @输入 
让didTapUserProfile = PublishRelay ()
  // @输出 
var openUserProfile:Observable
var用户名:Driver
var profileURL:驱动程序
  let id:整数 
私人让disposeBag = DisposeBag()
  deinit { 
RepoProvider.release(id:id)
}
 初始化(存储库:存储库){ 
self.id = repository.id
RepoProvider.addAndUpdate(存储库)
 让repoObserver = RepoProvider 
.observable(id:id)
.share(重播:1,
范围:.whileConnected)
  .... 
}

属性–输入,输出,标识符,DisposeBag 4批处理。 。음과음과음과음과음과같습니。

解释 :属性地产。 ,(View),,,,,,,,,,,ViewModel, 输入과정과루도록루도록다하겠습니다。

RxSwift提供的中继服务与PublishRelay的服务有关。 错误-完成-处置-视图다않는당황스당황스럽겠습니까。

输出 :视图위한이해주기해주数据공해줌과模型데이터를观察者하는属性입니다。 输出。다루도록루도록다。

标识符:模型标识符,属性模型,已分配ViewModel,模型提供者模型,属性,属性,标识符。

DisposeBag :RxSwift发行公告이생략하겠습니가실꺼라기생각하다。

输入/输出하겠습니다에하겠습니다。

输入/输出설계

ViewModel和ModelModel的初始下载。

  init(存储库:存储库){<<<<<<<< 
  } 

고模型고标识符(唯一值)를标识符属性에다。

 初始化(存储库:存储库){ 
self.id = repository.id <<<<<
}

모델은리고模型提供者줍시다。

 初始化(存储库:存储库){ 
self.id = repository.id
RepoProvider.addAndUpdate(存储库)<<<<<<
}

模型提供者ModelProvider观察者模型Model观察者模型观察者模型。

 初始化(存储库:存储库){ 
self.id = repository.id
RepoProvider.addAndUpdate(存储库)
 让repoObserver = RepoProvider 
.observable(id:id)<<<<<
.share(重播:1,
范围:.whileConnected)
}

用户名ASTextNode(View)用户名Observable형태의属性,输出도록보하겠습니다。

在repoObserver上的地图在Model上的Model在Model이上的Property Property中。 用户名观察者用户名观察者repoObserver观察者。

  self.username = repoObserver.map {$ 0?.user?.username} 
.asDriver(onErrorJustReturn:无)

$ 0(模型)中的用户属性,用户名属性和asDriver로驱动程序中的用户名观察者属性。 可观察的驱动程序驱动程序RxCocoa驱动程序驱动程序。

输出설계는게며며며며며며하시면하시면하시면하시면하시면하시면。。

루는지막으로사용자의이벤트를다루는Input을루는다설계하자면다。

시필필필시시。。。。。。。 房地产。

 类RepositoryViewModel { 
  // @输入 
让didTapUserProfile = PublishRelay ()
  // @输出 
var openUserProfile:Observable

didTapUserProfile与PublishRelay로만들었고,配置文件与openUserProfile(输出属性)的下载。

。리고이것들을이연결다。

 初始化(存储库:存储库){ 
....
  self.openUserProfile = self.didTapUserProfile.asObservable() 
  } 

을스로직이필요하다면이같이을리할리을

 初始化(存储库:存储库){ 
....
  self.openUserProfile = self.didTapUserProfile 
.map {...}
.asObservable()
  } 

하는데스로직을리하는데模型값이필요한

 初始化(存储库:存储库){ 
....
 让repoObserver = RepoProvider 
.observable(id:id)
.share(重播:1,
范围:.whileConnected)
  self.openUserProfile = self.didTapUserProfile 
.withLatestFrom(repoObserver)
.map {...}
.asObservable()
  } 

withLatestFrom(:Observable)용하여이용하여模型있습니다。

在ViewModel中查看。

视图— ViewModel绑定

View的Model Provider和ViewModel的提供者ViewView的视图模型。

바인딩이란ViewView的照片ViewModel와로와ViewModel부터업데이트해주기말합니다을다말합니다。

RxSwift(反应式)发行照片,Rx없이는MVVM发行照片。

공해주는observer물론공해주는-있만만만늘어납니다로。。 RxSwift가괜히。

RxCocoa的UIKit的产品UIUI的产品편으로的产品해줍니다。

在Texture(纹理)中查看1位图片,然后在RxCocoa图片(Pro)中查看。 이점을보완하기따로따브러이브러리를사용합니다。 (링크ME ME README.md포포터를되겠습니되겠습니다。)

GeekTree0101 / GTTexture-RxExtension
GTTexture-RxExtension —基于ASControlNode github.com的Texture RxSwift交互式包装 纹理+ RxSwift交互式包装
如何为纹理制作RxSwift交互式包装器? medium.com

따라서视图-> ViewModel용해서브러브러를브러같습니같습니。

  init(viewModel:RepositoryViewModel){ 

userProfileNode.rx
.tap(至:viewModel.didTapUserProfile)
.disposed(作者:disposeBag)

설계했던输入(didTapUSserProfile)음과bind이绑定수가있습니다。 在userProfileNode中点击事件,然后通过viewModel didTapUserProfile로이다。

고리고用户名输出은음과바인딩하여바인딩하여바인딩하여트트트있습니있습니있습니。

  init(viewModel:RepositoryViewModel){ 

viewModel.username.asObservable()
.bind(收件人:usernameNode.rx.text(Node.usernameAttributes),
setNeedsLayout:self)
.disposed(作者:disposeBag)

username이username이username usernameDriver와绑定(收件人:용하여이용하여usernameNode의文本绑定器연결해줌으로써View가업데이트다。

RxCocoa产品Binder产品和产品。 이。。있습니가있습니다。

ViewModel下载ViewModel下载ViewModel下载ViewModel下载ViewModel下载ViewModel。

使用ViewModel和RxTest开发RxTest。

RxSwift测试
我最喜欢的RxSwift功能之一是它的测试基础结构RxTest。 而且这也是一个未售出的,不是…… kean.github.io

R이RxSwift单元测试법에스트가트。 TDD하시는많은이생각이생각다。 Rx单元测试억기억다。

고리고纹理UI를单元测试난2월이난이있었는데요。 가능합니다。 使用UIKit进行UI单元测试。

进行纹理单元测试。

이번여기까지입니다。 하구요리고지막이이도。

지금까지1〜5편까해주신감의의고고고gle Vingle iOS같감의의다。

그리고이나수정이감사하겠습니다。

格式纹理最佳实践。

감사합니다。