1

基本的に、RSSフィードのアイテムを配列に保存してから、その配列を別の配列に配置して、すべてを格納します。たとえば、私はチャプターごとに大量の教育ビデオを保存することに取り組んでいるので(各チャプターにはRSSフィードがあります)、次のロジックを使用してMWFeedParserを使用してそれらを一度に解析しています。

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章の場所に保存されます。これは不必要に複雑な説明のように聞こえるかもしれませんが、私の要求は単にこれです:

フィードのリストから一度に1つのフィードを解析し、フィードが完全に解析されるまで続行せず、その内容が配列に挿入される方法はありますか?

それが役立つ場合は、次の4つのデリゲートメソッドが役立ちます。

- (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
}

みんなありがとう!

4

2 に答える 2

3

videosArray変数(たとえば)内のインデックスを追跡し、NSUInteger currentIndexそれをメソッドで使用しfeedParserDidFinish:て次のフィードの解析を開始できるように思えます。

次のメソッドを記述します。

- (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ループの代わりに、次のようにします。

currentIndex = 0;
[self parseNextVideo];

そしてfeedParserDidFinish:

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];
}
于 2013-02-05T19:11:17.827 に答える
1

これらすべてのパーサーを一度に解放するのではなく、デリゲートオブジェクトを少しスマートにします。まだ解析されていないフィードURLの可変配列を保持するようにします。の呼び出しを受け取ったらfeedParserDidFinish:、次のパーサーを作成し、そのURLをリストから削除します。配列にフィードが残っていない場合は、これで完了です。

単一のフィードで回復不能なエラー(フィードがURLに存在しない)、すべてのネットワーク操作に影響する一時的なエラー(ネットワーク接続の切断)、またはその他の望ましくない状況が発生する可能性があるため、失敗を示すデリゲートメソッドも実装する必要があります。これらの各ケースを適切に処理する必要があります。

于 2013-02-05T19:09:17.227 に答える