【发布时间】:2013-07-16 22:20:37
【问题描述】:
我开发了一个简单的 RSS 提取器应用程序,它解析来自程序员提供的网站的 XML RSS 提要,并在主视图控制器和详细视图控制器中的 UIWebView 中显示文章。我自定义设置了个人服务器,以将在主表视图(出于某些原因)中选择的 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...它只是我的 Master VC 类的一个 ivar。
所以,当我在 -[viewDidLoad] 中运行 dispatch_async() 函数时,它会运行 -[cachePDFRequests] 方法和其中的 for() 循环,然后在我新创建的线程上抛出 SIGABRT。请根据需要提出任何问题。如果我需要包含我尚未提供的任何代码,请告诉我。
这是我运行 GCD 线程时出现的 SIGABRT 错误的图片:
提前致谢!
附:如果 cacheView 设置为 nil,我曾经在 if() 循环中运行cacheView = [[UIWebView alloc] init];...这会引发 SIGABRT 错误。现在,在我删除该行后,它不再引用我的主视图控制器中的代码。
编辑:这里是 feeds 可变数组所包含的代码:
- (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]];
}
【问题讨论】:
-
您能只显示提要中的参数吗?
-
@MuraliK 我刚刚更新了问题以显示提要数组的相关代码。
标签: iphone objective-c objective-c-blocks grand-central-dispatch sigabrt