BNRSSFeedParser(及其 BNPodcastFeedParser)是处理 HTTP RSS 资源的一站式商店。解析非常简单,并不一定要太关心 RSS 规范。生成对象的接口尽可能遵守它们格式的标准。
可通过 CocoaPods 安装库
pod 'BNRSSFeedParser', '~> 2.1'
解析器类处理所有繁重的任务。parseFeedURL:
方法
- (void)parseFeedURL:(NSURL*)feedURL withETag:(NSString*)feedETag untilPubDate:(NSDate*)pubDate success:(void (^)(NSHTTPURLResponse*, BNRSSFeed*))success failure:(void (^)(NSHTTPURLResponse*, NSError*))failure
接受 RSS 源的 URL 以及可选的 ETag、日期、成功和失败块。
如果提供了 ETag,它将被分配给用于请求 RSS 数据的 NSURLRequest
。如果它是匹配的(服务器返回 HTTP 304),将调用失败块(不会发生解析,也不会从解析器中提供该源),您可以检查传递给块的 NSHTTPURLResponse
的 statusCode
以确定原因是否为 ETag 匹配。
如果有任何其他原因解析失败,也将调用失败块。
如果提供了 pubDate
,在解析 RSS 源的项元素时,将比较提供的 pubDate
,并且当项与提供的 pubDate
相等或之前时将停止解析。这是按照顺序进行的,即项在源中出现的顺序;这是为了提高速度和效率,所以如果源中的项顺序不正确,解析器可能找不到它们。解析器和源都不会知道有多少(如果有的话)项没有被解析。
由于源 pubDate(即通道元素的子代 pubDate 元素)不准确,因此 忽略。这可以防止解析器在源 pubDate 与最新源项不同步(即较早)时过早退出。
本质上,解析器将构建一个从 RSS 源到 NSDictionary
的字典,几乎不做验证。所有元素、属性和文本节点都将尽可能以合理的方式复制到字典中。如果元素仅包含文本节点,则在字典中相应键的值将是一个包含文本的 NSString
。如果元素还(或仅)包含子元素,则值将是一个 NSDictionary
;文本节点将有键 “@"__text__"”。
XML元素的属性也会映射到结果中的NSDictionary
对象的关键字中。
当存在等价兄弟元素(例如多个<item>
元素)时,它们将被放入一个NSArray
中。包含字典中的数组关键字是元素的名称,它不会变成复数形式。在所有情况下,解析器都不会假设元素是集合的一部分。也就是说,只有一个item元素的feed将不会有一个包含一个item的数组;它将直接有一个字典。
在此之后,该字典将被转换为BNRSSFeed
(或BNPodcastFeed
)对象,然后传递给parseFeedURL:
的success
块。
BNRSSFeedParser
对象本身确实有一个feed
属性,但它只在使用完毕并且XML解析完成后才可用。你通常只需处理作为success
块传递的feed对象,并且很可能没有必要在此之后保留解析器对象。
BNRSSFeed
是NSDictionary
的子类,并为RSS 2.0频道元素的已定义属性提供类型安全的访问器。与解析器生成的基础字典不同,这些属性尽量严格符合RSS规范。
目前,一些较少使用的元素尚未包含,如skipHours。它们可能最终会被添加。
预期为URL的元素返回为NSURL
对象,日期也是如此(到NSDate
)。某些属性(例如categories
和items
)将始终返回一个数组,无论feed中包含多少元素。
因为BNRSSFeed
是NSDictionary
的子类,所以你可以始终获取从feed解析的任何值,即使没有便利属性。`channel`属性返回原始feed中<rss><channel>
元素中所包含所有数据的NSDictionary
。
`items`属性返回一个代表解析从feed中的所有item元素的BNRSSFeedItem
(或BNPodcastFeedItem
)对象的NSArray
。
类似于BNRSSFeed
,BNRSSFeedItem
是NSDictionary
的子类,并为属于RSS feed项的常见元素提供便利属性。这也有助于它们严格遵守规范。
BNRSSFeed
对象的enclosure属性返回一个BNRSSFeedItemEnclosure
对象。
这是NSDictionary
的子类,具有url
、length
和type
属性。
播客子类为一些属性提供更具体的接口,这些属性对通用RSS feed不适用。包括iTunes特定元素。尚未包含所有与播客相关的属性。
虽然解析器类通常不关心feed中的数据,但对象类会。如果feed包含不符合RSS规范的日期,对象属性将失败。如果一个item包含多个enclosure,对象将简单地返回第一个。
BNRSSFeedParser
会在调用parser:parseErrorOccurred:
时调用failure
块。根据文档,当调用
abortParsing
时,应该调用parser:parseErrorOccurred:
。如果传入一个pubDate
并导致解析停止,abortParsing
会被调用。然而,这似乎并没有导致parser:parseErrorOccurred:
被调用。
BNRSSFeedParser
的正确行为是:如果因为pubDate
而停止解析,则应调用success
块,不应调用failure
块。如果未来abortParsing
的行为发生变化(例如,以匹配当前的文档),这些期望可能不会实现。