Безопасный способ рендеринга UIVIew в изображение в фоновом потоке?

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

  1. Создайте контроллер представления, который представляет пользовательский интерфейс, который я хочу показать на экране.
  2. Получить вид из контроллера представления и отобразить из него изображение.
  3. Сохраните его на диск и отобразите на экране позже

У меня происходит сбой, когда я пытаюсь получить доступ к представлению контроллера представления. Когда я пытался исследовать это в Интернете, я получаю противоречивые результаты о том, безопасно ли создавать представление в фоновом режиме. Я читаю, что вызов UIGraphicsGetCurrentContext должен быть потокобезопасным, но, возможно, не имеет доступа к UIView в фоновом потоке? Я пишу приложение для iOS 4 и выше. Вот код, который я использую (плитка - это контроллер просмотра):

CGSize size = CGSizeMake(20.0f, 30.0f);
UIGraphicsBeginImageContext(size);
[tile.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();           
UIGraphicsEndImageContext();

Сбой происходит при попытке доступа к свойству .view на плитке (EXC_BAD_ACCESS). Весь смысл в том, чтобы визуализировать представление в фоновом изображении, чтобы предотвратить блокировку пользовательского интерфейса, потому что нужно обработать много плиток.

Есть ли безопасный способ сделать это?


person Mark Struzinski    schedule 14.06.2011    source источник
comment
Вы когда-нибудь находили хорошее решение для этого?   -  person Ben Williams    schedule 01.11.2012
comment
Я столкнулся с такой же аварией. Согласно документации Apple, renderInContext МОЖЕТ БЫТЬ использовано на разная нить. Однако на самом деле он загадочным образом падает. Кто-нибудь нашел решение этой проблемы?   -  person Howy    schedule 17.07.2013
comment
Ты нашел решение для этого, Марк?   -  person Roi Mulia    schedule 22.09.2017


Ответы (1)


Я никогда не пробовал то, что вы описали, и мне не нравится быть вестником плохих новостей, но взято из документация Apple.

Примечание. В большинстве случаев классы UIKit следует использовать только в основном потоке приложения. Это особенно верно для классов, производных от UIResponder, или для тех, которые каким-либо образом манипулируют пользовательским интерфейсом вашего приложения.

Конечно, они удобно говорят «по большей части», так что остается место для маневра.

person Pieter    schedule 14.06.2011
comment
Как насчет передачи представления без манипулирования им? На данный момент я не имею дело с пользовательским интерфейсом на экране. Я просто создаю представление и сохраняю его в изображение. Если я не помещаю его на экран, будет ли безопасный способ справиться с этим? - person Mark Struzinski; 15.06.2011
comment
Запись образа на диск в отдельном потоке, безусловно, может быть выполнена безопасным способом. Однако получение изображения из калайера... если честно, я понятия не имею. Я предполагаю, что все зависит от того, что происходит внутри renderInContext, но такая информация, насколько я знаю, нигде не задокументирована. - person Pieter; 15.06.2011
comment
Спасибо, Питер. Я собираюсь попытаться найти обходной путь для нашей методологии. - person Mark Struzinski; 16.06.2011
comment
@MarkStruzinski Вы когда-нибудь придумывали надежный обходной путь для рендеринга слоев в фоновые изображения без привязки к пользовательскому интерфейсу? - person coneybeare; 20.11.2011