MVVM实战

1.层次依赖

- (UIViewController *)createInitialViewController {
    self.viewModelServices = [RWTViewModelServicesImpl new];
    self.viewModel = [[RWTFlickrSearchViewModel alloc] initWithServices:self.viewModelServices];
    return [[RWTFlickrSearchViewController alloc] initWithViewModel:self.viewModel];
}

2.数据绑定(View-->ViewModel,在VC的ViewDidLoad时调用)

- (void)bindViewModel
{
    self.title = self.viewModel.title;
    RAC(self.viewModel, searchText) = self.searchTextField.rac_textSignal;
   self.searchButton.rac_command = self.viewModel.executeSearch; //绑定ViewModel中创建的RACComand
    RAC([UIApplication sharedApplication], networkActivityIndicatorVisible) = self.viewModel.executeSearch.executing;
    RAC(self.loadingIndicator, hidden) = [self.viewModel.executeSearch.executing not];
    [self.viewModel.executeSearch.executionSignals subscribeNext:^(id x) {
        [self.searchTextField resignFirstResponder];
    }];

}

3.数据绑定(ViewModel-->Other,在ViewModel初始化时调用)

- (void)initialize
{
    self.title = @"Flickr Search";

    RACSignal *validSearchSignal =
    [[RACObserve(self, searchText)
      map:^id(NSString *text) {
        return @(text.length > 3);
    }]
     distinctUntilChanged];

    [validSearchSignal subscribeNext:^(id x) {
        NSLog(@"search text is valid %@", x);
    }];
}

4.异步接口(Model层的服务接口)

- (RACSignal *)signalFromAPIMethod:(NSString *)method arguments:(NSDictionary *)args transform:(id (^)(NSDictionary *response))block
{
    // 1. 创建请求信号
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

        // 2. 创建一个Flick请求对象
        OFFlickrAPIRequest *flickrRequest = [[OFFlickrAPIRequest alloc] initWithAPIContext:self.flickrContext];
        flickrRequest.delegate = self;
        [self.requests addObject:flickrRequest];

        // 3. 从代理方法中创建一个信号
        RACSignal *successSignal = [self rac_signalForSelector:@selector(flickrAPIRequest:didCompleteWithResponse:)
                                                  fromProtocol:@protocol(OFFlickrAPIRequestDelegate)];

        // 4. 处理响应
        [[[successSignal
         map:^id(RACTuple *tuple) {
             return tuple.second;
         }]
         map:block]
         subscribeNext:^(id x) {
             [subscriber sendNext:x];
             [subscriber sendCompleted];
         }];

        // 5. 开始请求
        [flickrRequest callAPIMethodWithGET:method arguments:args];

        // 6. 完成后,移除请求的引用
        return [RACDisposable disposableWithBlock:^{
            [self.requests removeObject:flickrRequest];
        }];
    }];
}
时间: 2024-11-09 02:10:10

MVVM实战的相关文章

MVVM 实战之计算器

MVVM 实战之计算器 android DataBinding MVVM calculator Model View 布局文件 Fragment ViewModel 结束语 前些日子,一直在学习基于 RxAndroid + Retrofit + DataBinding 技术组合的 MVVM 解决方案.初识这些知识,深深被它们的巧妙构思和方便快捷所吸引,心中颇为激动.但是,“纸上得来终觉浅,绝知此事要躬行”,学习完以后心里还是没有谱,于是,决定自己动手做一个基于这些技术和框架的小应用. 既然是对新

AvalonJS+MVVM实战部分源码

轻量级前端MVVM框架avalon,它兼容到 IE6 (其他MVVM框架,KnockoutJS(IE6), AngularJS(IE9), EmberJS(IE8), WinJS(IE9) ),它可以更高效地运行于IE10等新版本浏览器中.代码量少,方便格式化输出. AvalonJS的使用很方便,类似基础标签绑定值,前端代码非常简洁,如果你有一定的JS基础,上手都是很快的.大家下来可以了解一下. 不闲聊,直接看部分代码示例: 1 <script type="text/javascript&

ReactiveCocoa + MVVM

1.ReactiveCocoa常见操作方法介绍. 1.1 ReactiveCocoa操作须知 所有的信号(RACSignal)都可以进行操作处理,因为所有操作方法都定义在RACStream.h中,而RACSignal继承RACStream. 1.2 ReactiveCocoa操作思想 运用的是Hook(钩子)思想,Hook是一种用于改变API(应用程序编程接口:方法)执行结果的技术. Hook用处:截获API调用的技术. Hook原理:在每次调用一个API返回结果之前,先执行你自己的方法,改变结

ReactiveCocoa常见操作方法介绍/MVVM架构思想

1.ReactiveCocoa常见操作方法介绍. 1.1 ReactiveCocoa操作须知 所有的信号(RACSignal)都可以进行操作处理,因为所有操作方法都定义在RACStream.h中,因此只要继承RACStream就有了操作处理方法. 1.2 ReactiveCocoa操作思想 运用的是Hook(钩子)思想,Hook是一种用于改变API(应用程序编程接口:方法)执行结果的技术. Hook用处:截获API调用的技术. Hook原理:在每次调用一个API返回结果之前,先执行你自己的方法,

MVVM架构简单介绍

MVVM架构简单介绍 1 程序为什么要架构:便于程序员开发和维护代码. 2 常见的架构思想: MVC M:模型 V:视图 C:控制器 MVVM M:模型 V:视图+控制器 VM:视图模型 MVCS M:模型 V:视图 C:控制器 C:服务类 VIPER V:视图 I:交互器 P:展示器 E:实体 R:路由 (http://www.cocoachina.com/ios/20140703/9016.html) 3 MVVM介绍 模型(M):保存视图数据. 视图+控制器(V):展示内容 + 如何展示

最快让你上手ReactiveCocoa之进阶篇

前言 由于时间的问题,暂且只更新这么多了,后续还会持续更新本文<最快让你上手ReactiveCocoa之进阶篇>,目前只是简短的介绍了些RAC核心的一些方法,后续还需要加上MVVM+ReactiveCocoa实战开发.如果喜欢我的文章,可以关注我,微博:袁峥Seemygo,欢迎交流.也可以来小码哥,了解下我们的iOS培训课程.之后还会更新 1.ReactiveCocoa常见操作方法介绍. 1.1 ReactiveCocoa操作须知 所有的信号(RACSignal)都可以进行操作处理,因为所有操

iOS开发拓展篇—ReactiveCocoa常见操作方法介绍(进阶篇)

1.ReactiveCocoa常见操作方法介绍. 1.1 ReactiveCocoa操作须知 所有的信号(RACSignal)都可以进行操作处理,因为所有操作方法都定义在RACStream.h中,而RACSignal继承RACStream. 1.2 ReactiveCocoa操作思想 运用的是Hook(钩子)思想,Hook是一种用于改变API(应用程序编程接口:方法)执行结果的技术. Hook用处:截获API调用的技术. Hook原理:在每次调用一个API返回结果之前,先执行你自己的方法,改变结

互联网“寒冬”不想被辞退,Android程序员该如何应对?

最近,在气候转凉的同时,互联网领域也是寒气逼人,许多人担心互联网寒冬的到来.其实,寒冬来了又怎样?关键在于你怎么看待互联网寒冬. 寒冬中正好冥想. 寒冬中不能只是唉声叹气,更不能坐以待毙,而应该想想如何在寒冬中生存下去?想想以后的发展方向是什么?自己为什么抵御不住这寒冬?以后路在哪里?怎样走下去?怎样让自己更顺利的成长?寒冬也许是思考自己未来的最好时间段. ? 推荐一套大型Android程序员进阶架构师最全新的知识体系导图,对于才学基础的朋友可能用处不大,我相信对于开发多年的朋友这帮助会很大,对

CleanAOP实战系列--WPF中MVVM自动更新

CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: [email protected] QQ: 511363759 CleanAOP介绍:https://github.com/Jarvin-Guan/CleanAOP 前言 讲起WPF,开发模式MVVM是必不可少的,使用MVVM模式以后可以在View中写界面,需要使用到的数据则使用绑定的方式写到标签中,那么控制权就放到了ViewModel中,那么有一个需求是每一个使用MVVM者都会有的,就是在后台改变ViewModel的属