2015-02-20 3 views
0

Мне нужно заполнить массив. У меня есть два метода. Сначала создайте объект, который нужно добавить в массив. Я делаю это так:dispatch_async не входит в цикл

__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

Основываясь на других вопросах (т.е. http://stackoverflow.com/questions/28724811/property-value-is-equal-null-objective-c) может я рекомендую Вам изучить основы немного больше, прежде чем начинать в этой области, поскольку это немного более продвинутый материал, чем то, что вы, кажется, уже знаете. – Popeye

ответ

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.

НТН

+0

Большое спасибо! Это явно ответ !!!!)))) –

Смежные вопросы