JSON

ReactiveCocoa入门教程(5)

字号+ 作者:H5之家 来源:H5之家 2015-11-11 18:48 我要评论( )

接下来,在管道中添加一个 filter 操作来过滤掉无效的输入。在本例里就是长度不够3个字符的字符串: [[[[selfrequestAccessToTwitterSignal]then:^RACSignal*{@strongify(self)returnself.searchText.rac_textSigna

接下来,在管道中添加一个filter操作来过滤掉无效的输入。在本例里就是长度不够3个字符的字符串:

[[[[self requestAccessToTwitterSignal]     then:^RACSignal *{         @strongify(self)         return self.searchText.rac_textSignal;     }]     filter:^BOOL(NSString *text) {         @strongify(self)         return [self isValidSearchText:text];     }]     subscribeNext:^(id x) {         NSLog(@"%@", x);     } error:^(NSError *error) {         NSLog(@"An error occurred: %@", error);     }];?

 

 再次构建运行,观察过滤器的工作:

2014-01-04 08:16:12.548 TwitterInstant[39118:a0b] magi 2014-01-04 08:16:12.628 TwitterInstant[39118:a0b] magic 2014-01-04 08:16:13.172 TwitterInstant[39118:a0b] magic!?

 

现在用图形来表示管道,就和下图类似:

技术分享

 

管道从requestAccessToTwitterSignal 开始,然后转换为rac_textSignal。同时,next事件通过一个filter,最终到达订阅者的block。你还能看到第一步发送的error事件也是由subscribeNext:error:block来处理的。

 

现在你已经有了一个发送搜索文本的signal了,是时候来搜索Twitter的内容了。你现在觉得还好吗?我觉得应该还不错哦~

 

搜索Twitter的内容

你可以使用Social Framework来获取Twitter搜索API,但的确如你所料,Social Framework不是响应式的。那么下一步就是把所需的API调用封装进signal中。你现在应该熟悉这个过程了。

 

RWSearchFormViewController.m中,添加下面的方法:

- (SLRequest *)requestforTwitterSearchWithText:(NSString *)text { NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/search/tweets.json"]; NSDictionary *params = @{@"q" : text}; SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter                                         requestMethod:SLRequestMethodGET                                                   URL:url                                            parameters:params]; return request; }?

 

 方法创建了一个请求,请求通过v1.1 REST API来搜索Twitter。上面的代码使用q这个搜索参数来搜索Twitter中包含有给定字符串的微博。你可以在Twitter API 文档中来阅读更多关于搜索API和其他传入参数的信息。

 

 下一步是基于这个请求创建signal。在同一个文件中,添加下面的方法:

- (RACSignal *)signalForSearchWithText:(NSString *)text {     // 1 - define the errors     NSError *noAccountsError = [NSError errorWithDomain:RWTwitterInstantDomain                                                    code:RWTwitterInstantErrorNoTwitterAccounts                                                userInfo:nil];     NSError *invalidResponseError = [NSError errorWithDomain:RWTwitterInstantDomain                                                         code:RWTwitterInstantErrorInvalidResponse                                                         userInfo:nil];                                                             // 2 - create the signal block     @weakify(self)     return [RACSignal createSignal:^RACDisposable *(id subscriber) {         @strongify(self);                 // 3 - create the request         SLRequest *request = [self requestforTwitterSearchWithText:text];                 // 4 - supply a twitter account         NSArray *twitterAccounts = [self.accountStore accountsWithAccountType:self.twitterAccountType];         if (twitterAccounts.count == 0) {             [subscriber sendError:noAccountsError];         } else {             [request setAccount:[twitterAccounts lastObject]];                     // 5 - perform the request         [request performRequestWithHandler: ^(NSData *responseData,                 NSHTTPURLResponse *urlResponse, NSError *error) {             if (urlResponse.statusCode == 200) {                             // 6 - on success, parse the response                 NSDictionary *timelineData = [NSJSONSerialization JSONObjectWithData:responseData                                                 options:NSJSONReadingAllowFragments                                                   error:nil];                 [subscriber sendNext:timelineData];                 [subscriber sendCompleted];             } else {                 // 7 - send an error on failure                 [subscriber sendError:invalidResponseError];             }         }];     }     return nil;     }];}


分别讲一下每个步骤:

 

现在来使用这个新的signal!

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别

    Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别

    2016-01-18 17:28

  • 正则表达式优化JSON字符串的技巧

    正则表达式优化JSON字符串的技巧

    2016-01-18 09:06

  • Linux学习笔记:MySQL字符集

    Linux学习笔记:MySQL字符集

    2016-01-17 18:24

  • PHP学习之字符串比较和查找

    PHP学习之字符串比较和查找

    2016-01-17 18:23

网友点评