0

プログラマー提供の Web サイトから XML RSS フィードを解析し、記事をマスター ビュー コントローラーに表示し、UIWebView を詳細ビュー コントローラーに表示する単純な RSS フェッチャー アプリケーションを開発しました。マスター テーブル ビューで選択された RSS 記事を (特定の理由で) PDF としてレンダリングするように、パーソナル サーバーをカスタム セットアップしました。ただし、サーバー側で選択したテーブル ビュー セルが既に PDF としてレンダリングされていない限り、これにはサーバー側で明らかに時間がかかります。私のサーバーとブログは相互に通信しない (他の理由で通信できない) ため、ブログ投稿を作成する際に PDF を事前にレンダリングすることができません。PDF レンダリングは、アプリケーション自体から実行する必要があります。

ユーザーが任意のセルを選択して投稿を表示できるようになる前に、Grand Central Dispatch を使用して別のスレッドを作成し、サーバーと通信して PDF をレンダリングすることにしました。キューを作成するために使用したコードを次に示します。

dispatch_queue_t networkQueue = dispatch_queue_create("com.company.networkQueue", NULL);

...そして、新しいスレッドを作成するために使用したコード...

dispatch_async(networkQueue, ^{ [self cachePDFRequests]; });

...ブロック要求で呼び出される私の cachePDFRequests メソッドは次のとおりです...

- (void) cachePDFRequests {
    NSURL *myURL;
    NSString *cacheUrl;
    NSURLRequest *request;

    for (int i = 0; i <= feeds.count; i++) {

        cacheUrl = [feeds[i] objectForKey:@"link"];
        cacheUrl = [cacheUrl stringByReplacingOccurrencesOfString:@" " withString:@""];
        cacheUrl = [cacheUrl stringByReplacingOccurrencesOfString:@"\n" withString:@""];

        NSString *fullUrl = [NSString stringWithFormat:@"http://myserver.com/render.php?url=%@", cacheUrl];

        myURL = [NSURL URLWithString:fullUrl];
        request = [NSURLRequest requestWithURL:myURL];

        [cacheView loadRequest:request];
    }
}

注: cacheView は、どの UI にもない UIWebView です...これは、マスター VC クラスの単なる ivar です。

したがって、dispatch_async()-[viewDidLoad] で関数を実行すると、-[cachePDFRequests] メソッドとその内部で for() ループが実行され、新しく作成したスレッドで SIGABRT がスローされます。必要に応じてご質問ください。まだ提供していないコードを含める必要がある場合はお知らせください。

GCD スレッドを実行するたびに表示される SIGABRT エラーの図を次に示します。

http://tinypic.com/r/1038zd1/5

前もって感謝します!

PS cacheView = [[UIWebView alloc] init];cacheView が nil に設定されている場合、if() ループで実行していました...これは SIGABRT エラーをスローしていました。その行を削除した後、Master View Controller のコードへの参照がなくなりました。

編集: フィードの可変配列に含まれているコードは次のとおりです。

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

if ([elementName isEqualToString:@"item"]) {

    [item setObject:title forKey:@"title"];
    [item setObject:link forKey:@"link"];

    [feeds addObject:[item copy]];

}
4

1 に答える 1

3

範囲外にアクセスしているようですfeedsNSArray境界外のインデックスでアクセスしようとすると、例外がスローされます。これは、まさにバックトレースが示していることです。これは、インデックスが 0 で始まる配列をループする正しい方法です。

for (int i = 0; i < feeds.count; i++) // Notice that it uses < instead of <= as comparator

補足として、if()ループなどはありません。

于 2013-07-16T05:48:12.627 に答える