数据驱动与ReactiveCocoa iOS开发
数据驱动与ReactiveCocoa iOS开发编者按:这篇文章是由霍华德蔓生和马特·马赛厄斯。 ReactiveCocoa(RAC)是一个objective - c功能反应性编程框架,旨在提供更简洁,这样的代码。 一些有用的框架介绍,你可以看我们的技术讨论,你可以看看一些介绍性的文章在这里,在这里,在这里。 在这篇文章中,我们将假定您熟悉典型ReactiveCocoa术语像溪流,信号,用户,等等。这些资源是伟大的为RAC得到最初的味道,但是如果你渴望更像我们,那么你可能很难找到一篇文章与RAC更全功能的应用程序细节。 为此,我们创建了一个应用程序这使得大量使用RAC。 我们的应用程序演示了如何在应用程序中使用RAC的网络和用户界面层。 一路上,我们会强调什么我们认为RAC,而且也凸显其局限性。 我们认为RAC的主要好处之一是它能够无缝地将应用程序的UI模型和绑定到的数据流,你希望来表示。 开始使用REACTIVECOCOA第一个开始是给你的项目带来RAC。 你有两个选择。
为了方便起见,我们使用CocoaPods。 我们如果我们没有提到CocoaDocs主机一套精彩的文档RAC。 一定要检查它。 活性堆栈溢出 我们的应用程序利用堆栈溢出的公共API列表网站最大的问题以下平台:Android,iOS,Ruby和Windows Phone。 我们使用一个 使用RACSIGNAL @weakify(self); RACSignal *topQuestionsSignal = [[sharedStore topQuestions] deliverOn:[RACScheduler mainThreadScheduler]]; 我们开始与 - (RACSignal *)topQuestions { RACSignal *signal = [[RSOWebServices sharedServices] fetchQuestionsWithTag:nil]; return [self questionsForSignal:signal]; } 正如我们所看到的,它发送一条消息到我们的web服务单,并返回一个信号。 让我们去拜访 - (RACSignal *)fetchQuestionsWithTag:(NSString *)tag { NSURL *fetchQuestionURL = [self createRelativeURLWithTag:tag]; @weakify(self); RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { ... 这个方法返回一个 @strongify(self); NSURLSessionDataTask *task = [self.client dataTaskWithURL:fetchQuestionURL completionHandler:^(NSData *data,NSURLResponse *response,NSError *error) { if(error) { [subscriber sendError:error]; } else if(!data) { NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"No data was received from the server."}; NSError *dataError = [NSError errorWithDomain:RSOErrorDomain code:RSOErrorCode userInfo:userInfo]; [subscriber sendError:dataError]; } else { NSError *jsonError; NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError]; if(jsonError) { [subscriber sendError:jsonError]; } else { [subscriber sendNext:dict[@"items"]]; [subscriber sendCompleted]; } } }]; [task resume]; return [RACDisposable disposableWithBlock:^{ [task cancel]; }]; }]; return signal; } 里面 - (RACSignal *)questionsForSignal:(RACSignal *)signal { return [signal map:^(NSArray *questionDicts) { NSMutableArray *questions = [[NSMutableArray alloc]init]; for(NSDictionary *questionDictionaryItem in questionsDicts) { RSOQuestion *question = [RSOQuestion questionForDictionary:questionDictionaryItem]; [questions addObject:question]; } return [questions copy]; }]; } 就像我们上面所讨论的其他方法,我们返回一个 [topQuestionsSignal subscribeNext:^(NSArray *questions) { @strongify(self); [self loadQuestions:questions]; } error:^(NSError *error) { [self displayError:[error localizedDescription] title:@"An error occurred"]; [progressOverlay hide:YES]; } completed:^{ [progressOverlay hide:YES afterDelay:1]; }]; 刷新TABLEVIEW 接下来,我们初始化 UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [[refreshControl rac_signalForControlEvents:UIControlEventValueChanged] subscribeNext:^(UIRefreshControl *refreshControl) { @strongify(self); [topQuestionsSignal subscribeNext:^(NSArray *questions){ [self loadQuestions:questions]; } error:^(NSError *error) { [self displayError:error.localizedDescription title:@"An error occurred"]; [refreshControl endRefreshing]; } completed:^{ [refreshControl endRefreshing]; }]; }]; self.refreshControl = refreshControl; RAC提供了许多有用的功能类别,允许开发人员贪污RAC系统组件上。 在上面的代码中, 过滤TABLEVIEW 功能的最后一点,我们想强调我们的tableview顶部的搜索框。 我们使用这个搜索框过滤表的内容与用户输入的查询字符串文本字段。 搜索框使用类别 RACSignal *searchBoxSignal = [[[self.searchBox rac_textSignal] throttle:kSearchQueryThrottle] skip:1]; RAC(self,filteredTopQuestions) = [RACSignal combineLatest:@[searchBoxSignal,topQuestionsSignal] reduce:^id(NSString *filterString,NSArray *questions) { @strongify(self); if ([filterString length] > 0) { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"text contains %@",filterString]; self.filteredTopQuestions = [questions filteredArrayUsingPredicate:predicate]; return self.filteredTopQuestions; } else { return questions; } }]; 返回的信号 这是一个包装 我们已经完成了很多:创建了一些信号,通过通过方法和类,他们做了一些工作,使用结果填写我们的数据模型和改变了我们的UI。 总的来说,这之旅
一些最后的想法RAC的一个令人兴奋的前景是减轻负担的所有这些艰苦的检查应用程序状态。 移动应用程序尤其数据饥饿和RAC为开发人员提供一组工具,可以匹配我们的模型和用户界面的数据,他们将使用更方便。 基于块的结构也是一个巨大的胜利。 这样方便带来一些成本和风险。 首先,RAC至少是一个小的语法偏离你的代码可以用来打字。 第二,RAC需要流利的各种各样的新概念,以了解如何使用框架来解决问题。 第三,或许最有争议的是,RAC旨在介绍函数式编程objective - c时,它不能完全成功。 例如,RAC无法绑定一个UI元素(如数据收集。,tableview)。 这样,你仍然需要使用tableview的数据源方法用数据填充表。 无论是好是坏,不会完全功能的应用程序的代码。 可可并不是这种方式构建;然而,值得一提的是,objective - c的基于块的现在和未来正在并将带我们沿着功能路径。 由开发人员和团队,以确保项目的代码是连贯的,有效的和高效的。 总而言之,我们认为RAC提供了一个奇妙的工具套件,当适当地实施,可以使代码更容易阅读的一些元素,更易于维护和更愉快的写。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 正则表达式 – 正确使用perl中负向前瞻表达式内的插入符号
- ruby-on-rails – 社交媒体分享按钮Ruby for Rails
- ruby-on-rails – Rails,paperclip,从rake任务上传照片?
- c# – 如何选择已使用OpenFileDialog打开的文件
- 在xcode /中的objective-c -c函数声明用在调试和发布中表现
- c# – DataContractSerializer – 问题
- Ajax核心知识总结
- c# – 将字符串与Regex与IgnoreCase或字符串的ToLower方法进
- cocos2dx源码阅读之万能的Value
- c# – Microsoft.Office.Interop.Excel.dll未包含在构建文件