2

我有:

1)同时启动 2 个异步 NSUrlRequests

2) 一旦两个请求之一加载了 XML 数据,就使用 NSOperationQueue 来启动 XML 解析器。因此,ParseOperations 的工作方式与 Apple 的 LazyTableImages 示例一样。

InfoRequestHelper.m

// ...

case GetBlogEntries:
{
    BlogParseOperation *parser = [[BlogParseOperation alloc] initWithXMLString:result delegate:self];
    parser.tag = helper.requestTag;

    [queue addOperation:parser]; // this will start the "ParseOperation"

    [parser release];

    break;
}
case GetTweets:
{
    TwitterParseOperation *parser = [[TwitterParseOperation alloc] initWithXMLString:result delegate:self];
    parser.tag = helper.requestTag;

    [queue addOperation:parser]; // this will start the "ParseOperation"

    [parser release];

    break;
}

// ...

3) 当解析完成 parser:didFinishParsing: 触发。

InfoRequestHelper.m

- (void)parser:(ParseOperationBase *)parser didFinishParsing:(NSArray *)entries
{
    // Save data, remove completed request from list
    [self.requestsInProgress removeObjectForKey:parser.tag];
    [self.resultObjects addObjectsFromArray:entries];  // <= !!! EXC_BAD_ACCESS !!! here

    // ..    
}

问题:当第一个事件到达这里时,可以将对象添加到数组中。但是当第二个到达时,有一个 EXC_BAD_ACCESS。

4

2 回答 2

1

编辑:我认为您正在尝试resultObjects在两种解析方法中访问变量。resultObjects 是一个可变数组。所以问题是当你试图从一个函数的变量中添加或删除一个对象时,另一个函数也试图访问它。这会给你一个错误。我在创建多线程应用程序时也学到了这一点。

您可以查看有关线程不安全类的苹果文档。避免它的最好方法是使用 NSArray 对象。

当您想从变量中添加或删除对象时,您可以首先将内容放入可变数组并对其进行操作,然后将其分配回原始对象。

我希望这是有道理的。我知道找到这样的错误会有多难。

于 2011-02-09T08:23:03.450 回答
0

如果您使用相同的数组来填充数据,那么我认为您缺少基本的线程概念。 您不得从多个线程以写入模式访问变量。

您应该首先获取阵列上的锁,然后继续。

于 2011-02-09T12:54:24.923 回答