我需要填写数组。我有两种方法。首先是需要添加到数组的创建对象。我是这样做的:
__block NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:inputArray.count];
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{
dispatch_apply(inputArray.count,queue , ^(size_t index) {
[array insertObject:[self getObject:[inputArray objectAtIndex:index]] atIndex:index];
});
});
最后我收到的数组包含2个对象而不是100个。我需要获取包含在getObject
函数中处理的对象的数组。
如果我编码:
dispatch_apply(inputArray.count, queue, ^(size_t index){
[array insertObject:[self getObject:[inputArray objectAtIndex:index]] atIndex:index];
});
我收到不同数量的数组计数。谁能告诉我如何正确地做到这一点?
答案 0 :(得分:0)
方法initWithCapacity
不创建一个包含许多元素的数组,它只是NSMutableArray
提示元素数量可能是多少。然后,当您尝试在特定实例中插入对象时出现问题。来自insertObject:atIndex:
的文档:
请注意,NSArray对象与C数组不同。也就是说,即使您在创建数组时指定了大小,指定的大小也会被视为“提示”;数组的实际大小仍为0.这意味着您无法在大于当前数组计数的索引处插入对象。例如,如果一个数组包含两个对象,其大小为2,那么您可以在索引0,1或2处添加对象。索引3是非法的并且超出范围;如果您尝试在索引3处添加对象(当数组的大小为2时),NSMutableArray会引发异常。
您将获得不同的行为,具体取决于dispatch_apply
排队的行的执行顺序。
我假设您正在执行此操作,因为getObject:
是一个耗时的过程,但其中多个可以并行执行。如果是这样的话,那么:
a)在分配数组之后,用廉价的对象预先填充它,例如[NSNull null]
会这样做。
b)使用replaceObjectAtIndex:withObject:
将您的对象添加到数组中,这会将您预先填充的对象替换为真实对象。
注意:您也在滥用__block
。当您希望在块中更改封闭方法中的局部变量的值时,此属性适用。将引用分配给array
实例后,从不>>在方法或块中更改NSMutableArray
的值声明。然后,您的代码会修改引用的对象的内容,而不是引用的值。删除__block
。
HTH