0

Я создаю очередь, где сначала сжимаю изображения в фоновом режиме и добавляю их в словарь в основной очереди. Затем все изображения включали и добавляли сообщение для печати. Я не архивирую его с моим кодом. Зачем?Queuing with dispatch

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    NSMutableArray *images = [_adv[@"images"] mutableCopy]; 
    for (NSMutableDictionary *i in images) 
    { 
     UIImage *large = [UIImage compressImage:i[@"original"]]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      i[@"large"] = large; 
      [i removeObjectForKey:@"original"]; 
     }); 
    } 


    dispatch_sync(dispatch_get_main_queue(), ^{ 

     NSLog(@"%@", _adv); 
     NSLog(@"\n ГОТОВО"); 
    }); 
}); 

ответ

0

Try резервировать основную очередь для пользователя интерактивной работы.

Вы должны создать свою собственную очередь для взаимодействия с вашими изменяемыми структурами данных. Для этой цели я предлагаю использовать параллельную очередь. Написание должно быть сделано с барьером.

Возможно, вы должны выполнить фоновое копирование в фоновом режиме, и вы, вероятно, должны делать эти вещи асинхронно, поскольку вам, вероятно, не нужны результаты после того, как вы отменили задание и не хотите блокировать вызывающий поток на фоновая работа.

Я предложил бы делать что-то более подобное (написанное прямо здесь, так что могут быть незначительные ошибки):

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    NSArray *images = _adv[@"images"]; 
    for (NSMutableDictionary *i in images.copy) 
    { 
     UIImage *large = [UIImage compressImage:i[@"original"]]; 

     dispatch_barrier_sync(queueThatYouHaveToGuardAccessToTheseData, ^{ 
      i[@"large"] = large; 
      [i removeObjectForKey:@"original"]; 
     }); 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"%@", _adv); 
     NSLog(@"\n ГОТОВО"); 
    }); 
}); 

Обратите внимание, что вам нужно создать queueThatYouHaveToGuardAccessToTheseData как параллельной очереди впереди времени. Вероятно, было бы лучше иметь queueThatYouHaveToGuardAccessToTheseData для ввода этой функции или иметь один мьютекс на изображение (или коллекцию или что-то подобное), чтобы избежать единственной глобальной блокировки записи.

0

Выполнение этого кода на главном потоке приведет к тупиковой ситуации, потому что вы используете dispatch_sync дважды. Возможно, в этом и проблема. Попробуйте dispatch_async вместо:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)