dispatch_async不会进入循环

时间:2015-02-20 18:22:44

标签: objective-c synchronization grand-central-dispatch

我需要填写数组。我有两种方法。首先是需要添加到数组的创建对象。我是这样做的:

 __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];

    });

我收到不同数量的数组计数。谁能告诉我如何正确地做到这一点?

1 个答案:

答案 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