【问题标题】:GCD-created thread throws abort after completing block messageGCD 创建的线程在完成块消息后抛出异常
【发布时间】: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


【解决方案1】:

您似乎正在越界访问feedsNSArray 如果您尝试使用超出其边界的索引访问它,则会引发异常,而这正是回溯所指示的。这是遍历索引以 0 开头的数组的正确方法:

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

顺便说一句,没有if() 循环之类的东西。

【讨论】:

  • 再次抱歉,我现在明白这有什么不同了。我试图返回一个数组中不存在的对象。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-03-11
  • 2019-02-09
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多