dispatch_async 没有进入循环

dispatch_async doesn't go into loop

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

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

    });

我收到不同数量的数组计数。谁能告诉我如何正确操作?

方法 initWithCapacity 不会 创建一个包含那么多元素的数组,它只是提示 NSMutableArray 元素的数量是多少可能是。当您随后尝试在特定实例中插入对象时,事情就出错了。来自 insertObject:atIndex: 的文档:

Note that NSArray objects are not like C arrays. That is, even though you specify a size when you create an array, the specified size is regarded as a “hint”; the actual size of the array is still 0. This means that you cannot insert an object at an index greater than the current count of an array. For example, if an array contains two objects, its size is 2, so you can add objects at indices 0, 1, or 2. Index 3 is illegal and out of bounds; if you try to add an object at index 3 (when the size of the array is 2), NSMutableArray raises an exception.

根据 dispatch_apply 排队的块的执行顺序,您将获得不同的行为。

我假设您正在这样做,因为您的 getObject: 是一个耗时的过程,但其中多个可以并行执行。如果是这样的话:

a) 分配数组后用便宜的对象预填充它,例如[NSNull null] 就行了。

b) 使用 replaceObjectAtIndex:withObject: 将您的对象添加到数组中,这将用您的真实对象替换您预先填充的对象。

注意:你也在误用__block。当您希望从块内的封闭方法中更改局部变量的 value 时,此属性适用。在将 reference 分配给 NSMutableArray 之后,您 永远不会 在方法或块中更改 array 的值声明时实例化它。然后您的代码修改 referenced 对象的内容,而不是引用的 value 的内容。删除 __block.

HTH