我有:
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)解析完成后,解析器:didFinishParsing:fires。
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。
答案 0 :(得分:1)
编辑:
我想你正试图在两种解析方法中访问resultObjects
变量。和resultObjects是一个mutableArray。所以问题是当你试图从一个函数中添加或删除变量中的对象时,另一个函数也试图访问它。这会给你一个错误。我在创建多线程应用程序时也学到了这一点。
您可以在线程不安全的类上看到Apple文档。而避免它的最好方法是使用NSArray对象。
当您想要从变量中添加或删除对象时,您可以先将内容放入可变数组中并对其进行操作,然后将其分配回原始对象。
我希望这是有道理的。我知道找到这样的错误会有多难。
答案 1 :(得分:0)
如果您使用相同的数组填充数据,那么我认为您缺少基本的线程概念。 您不得在多个线程的写入模式下访问变量。
您应先在阵列上acquire a lock然后继续。