iOS: основное изображение и многопоточные приложения
Я пытаюсь запустить некоторые основные фильтры изображений наиболее эффективным способом. Попытка избежать предупреждений памяти и сбоев, которые я получаю при рендеринге больших изображений. Я смотрю на Apple,Руководство по программированию основного изображения. Относительно многопоточности это говорит:каждый поток должен создавать свои собственные объекты CIFilter. В противном случае ваше приложение может работать неожиданно ».
Что это значит?
На самом деле я пытаюсь запустить свои фильтры в фоновом потоке, чтобы я мог запустить HUD в основном потоке (см. Ниже). Имеет ли это смысл в контексте coreImage? Я понимаю, что основное изображение по своей сути использует GCD.
//start HUD code here, on main thread
// Get a concurrent queue form the system
dispatch_queue_t concurrentQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
//Effect image using Core Image filter chain on a background thread
dispatch_async(dispatch_get_main_queue(), ^{
//dismiss HUD and add fitered image to imageView in main thread
});
});
Больше от Apple Docs:
Поддержание безопасности потока
Объекты CIContext и CIImage являются неизменяемыми, что означает, что каждый из них может безопасно использоваться всеми потоками. Несколько потоков могут использовать один и тот же объект CIContext для GPU или CPU для визуализации объектов CIImage. Однако это не относится к объектам CIFilter, которые являются изменяемыми. Объект CIFilter нельзя безопасно разделить между потоками. Если ваше приложение является многопоточным, каждый поток должен создавать свои собственные объекты CIFilter. В противном случае ваше приложение может работать неожиданно.