プログラマー提供の 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 エラーの図を次に示します。
前もって感謝します!
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]];
}