如何从 rac_sequence、reactive cocoa、ios 获取项目
Posted
技术标签:
【中文标题】如何从 rac_sequence、reactive cocoa、ios 获取项目【英文标题】:how to get item from rac_sequence, reactive cocoa, ios 【发布时间】:2015-06-13 17:11:02 【问题描述】:我正在解析位于服务器响应标头中的所需链接。我的标题看起来像
Access-Control-Allow-Origin → * Age → 0 Cache-Control → 私人的,必须重新验证
连接→保持活动
Content-Encoding → gzip Content-Type → application/json
日期 → 2015 年 6 月 13 日星期六 15:58:56 GMT ETag → W/“cb38bb07f1635fd6aba5969985bf0607”
链接→http://thisIsCurrentlink&limit=24; rel="下一个",http://thisIsLastlink&limit=24; rel="last",http://thisIsFirstlink&limit=24;相对=“第一”,; rel="prev"
服务器 → nginx
变化 → 接受编码
X-Total-Count → 131
传输编码→分块
通过这样做,我可以获得包含所有链接的links
数组
NSString *linkHeader = [(NSHTTPURLResponse *)operation.response allHeaderFields][@"Link"];
NSArray *links = [linkHeader componentsSeparatedByString:@","];
然后我正在执行以下操作以获取我需要的所有链接
RACSequence *sequence = [links.rac_sequence map:^id(NSString* item)
NSError *error;
NSLog(@"item is %@",item);
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<(.*)>" options:0 error:&error];
NSString *actualLink;
if (regex != nil)
NSTextCheckingResult *result = [regex firstMatchInString:item
options:0
range:NSMakeRange(0, item.length)
];
if (result)
NSRange range = [result rangeAtIndex:1];
actualLink = [item substringWithRange:range];
NSLog(@"actualLink is %@",actualLink);
return [RACSequence return:actualLink];
return [RACSequence empty];
];
现在sequence
包含所有链接
http://thisIsCurrentlink&limit=24
http://thisIsLastlink&limit=24
http://thisIsFirsttlink&limit=24
我的问题是如何从sequence
上方访问每个项目
【问题讨论】:
【参考方案1】:只需使用array
方法,它将RACSequence 转换为数组。
另外,你不需要使用RACSequence return:
,这是在你的序列中创建序列,只需返回通常的字符串和 nil,然后在 map
之后使用 filter
删除所有 nil 值,然后再尝试将其提取为数组。
例子:
NSArray *actualLinks = [[links.rac_sequence map:^id(NSString* item)
NSError *error = nil;
NSLog(@"item is %@",item);
NSRegularExpression *regex =
[NSRegularExpression regularExpressionWithPattern:@"<(.*)>" options:0 error:&error];
NSString *actualLink = nil;
if (regex != nil)
NSTextCheckingResult *result = [regex firstMatchInString:item
options:0
range:NSMakeRange(0, item.length)];
if (result)
NSRange range = [result rangeAtIndex:1];
actualLink = [item substringWithRange:range];
NSLog(@"actualLink is %@",actualLink);
return actualLink;
] ignore:nil].array;
【讨论】:
您可以使用-ignore
方法和nil
: 参数代替filter
@MichałCiuba 这是一个超级酷的方法,我会努力记住这一点。以上是关于如何从 rac_sequence、reactive cocoa、ios 获取项目的主要内容,如果未能解决你的问题,请参考以下文章
如何(不)在Java 9+中使用Reactive Streams
如何使用 asp.net Web API 2(使用 TPL/Reactive)缓冲和批处理 REST 获取查询?
Reactive.NET - 从 .Subscribe 返回通用对象