首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何一次解析一个RSS提要列表?

如何一次解析一个RSS提要列表?
EN

Stack Overflow用户
提问于 2013-02-06 03:01:13
回答 2查看 783关注 0票数 1

我实际上是将RSS提要中的条目保存到一个数组中,然后将该数组放入另一个数组中以包含所有条目。例如,我正在按章节保存一组教育视频(每个章节都有一个RSS ),所以我使用以下逻辑一次性使用MWFeedParser解析它们:

代码语言:javascript
复制
for (NSString *url in videosArray) {    
        NSURL *feedURL = [NSURL URLWithString:url];
        feedParser = [[MWFeedParser alloc] initWithFeedURL:feedURL];
        feedParser.delegate = self;
        feedParser.feedParseType = ParseTypeFull;
        feedParser.connectionType = ConnectionTypeAsynchronously;
        [feedParser parse];
        }

这样做的同时,如果第3章RSS提要在第2章之前完成解析,则第3章的内容将保存在第2章的位置。虽然这听起来可能是一个不必要的复杂解释,但我的要求很简单:

有没有办法从提要列表中一次解析一个提要,直到提要被完全解析并将其内容插入到数组中时才继续?

如果有帮助,这里有4个可能有用的委托方法:

代码语言:javascript
复制
- (void)feedParserDidStart:(MWFeedParser *)parser {
NSLog(@"Started Parsing: %@", parser.url);
}

- (void)feedParser:(MWFeedParser *)parser didParseFeedInfo:(MWFeedInfo *)info {
NSLog(@"Parsed Feed Info: “%@”", info.title);
self.title = info.title;
}

- (void)feedParser:(MWFeedParser *)parser didParseFeedItem:(MWFeedItem *)item {
NSLog(@"Parsed Feed Item: “%@”", item.title);
if (item) [parsedItems addObject:item];
}

- (void)feedParserDidFinish:(MWFeedParser *)parser {
NSLog(@"Finished Parsing%@", (parser.stopped ? @" (Stopped)" : @""));
[courseBeingBuilt.mediaCollection addObject:parsedItems]; // Place chapter contents into Course's Chapter w/contents array
parsedItems = [[NSMutableArray alloc] init]; // Create new array for new chapter
}

谢谢你们!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-06 03:11:18

听起来您可以在一个变量(比如NSUInteger currentIndex)中跟踪videosArray中的索引,并在feedParserDidFinish:方法中使用它来开始解析下一个提要。

编写以下方法:

代码语言:javascript
复制
- (void) parseNextVideo
{
    NSURL *feedURL = [NSURL URLWithString:[videosArray objectAtIndex:currentIndex++]];
    feedParser = [[MWFeedParser alloc] initWithFeedURL:feedURL];
    feedParser.delegate = self;
    feedParser.feedParseType = ParseTypeFull;
    feedParser.connectionType = ConnectionTypeAsynchronously;
    [feedParser parse];
}

而不是for循环,只需:

代码语言:javascript
复制
currentIndex = 0;
[self parseNextVideo];

然后在feedParserDidFinish:

代码语言:javascript
复制
NSLog(@"Finished Parsing%@", (parser.stopped ? @" (Stopped)" : @""));
[courseBeingBuilt.mediaCollection addObject:parsedItems]; // Place chapter contents into Course's Chapter w/contents array
parsedItems = [[NSMutableArray alloc] init]; // Create new array for new chapter
if (currentIndex < videosArray.count) {
    [self parseNextVideo];
}
票数 3
EN

Stack Overflow用户

发布于 2013-02-06 03:09:17

与其立即释放所有这些解析器,不如让您的委托对象更智能一些:让它保留一个尚未解析的提要URL的可变数组。当您收到对feedParserDidFinish:的调用时,创建下一个解析器并从列表中删除它的URL。如果数组中没有任何提要,那么就完成了。

您还应该实现指示失败的委托方法,因为您可能会遇到单个提要的不可恢复的错误(提要不存在于URL中)、影响所有网络操作的暂时性错误(网络连接断开),或者其他一些不受欢迎的情况。您将希望适当地处理每一种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14714889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档