Следующая строка должна быть в основном потоке:
UIImage* img = [UIImage imageWithCGImage: imageRef];
Остальная часть кода выглядит так, как будто было бы нормально находиться в другом потоке.
Любое взаимодействие с UIKit должно быть в основном потоке. Вот почему создание UIImage (или даже что-то вроде установки изображения UIImageView) должно выполняться в основном потоке. К счастью, тяжелая работа, такая как загрузка изображения или, возможно, даже рисование, как вы делаете, может быть выполнена в отдельном потоке. Затем вы возвращаетесь в основной поток, чтобы создать UIImage.
Используя Grand Central Dispatch и некоторые блоки, следующий код может работать для вас:
</p>
<code> dispatch_queue_t drawingQueue = dispatch_queue_create("Drawing image", NULL);
dispatch_async(drawingQueue, ^{
CGContextRef context = CreateARGBBitmapContext(entireRect.size);
CGContextDrawImage(context, rect, originalImage.CGImage);
CGImageRef imageRef = CGBitmapContextCreateImage(context);
dispatch_async(dispatch_get_main_queue(), ^{
UIImage* img = [UIImage imageWithCGImage: imageRef];
CGImageRelease(imageRef);
});
});
dispatch_release(drawingQueue);
</code>
Если вы не знакомы с Grand Central Dispatch, попробуйте поискать его в Google. Боюсь, я не знаю хорошего учебника для него. Надеюсь, что это полезно.
ИСПРАВЛЕНИЕ:
Мой ответ выше неверен. UIImage МОЖЕТ быть создан в главном потоке.
Хотя большая часть взаимодействия с UIKit должна выполняться в основном потоке, есть несколько исключений, включая UIImage, UIColor, UIFont и Core Graphics. Это все потокобезопасные.
(Обратите внимание, что я считаю, что UIImageView не является потокобезопасным. Так что, если бы вы установили изображение UIImageView, вам пришлось бы вернуться к основному потоку. Вариант приведенного выше кода все равно будет полезен для взаимодействия с другие объекты UIKit, и в этом случае не должны наносить никакого ущерба - кроме ненужных усложняющих вещей.)