Создание UIImage путем рендеринга UIWebView в фоновом потоке - iPhone - PullRequest
9 голосов
/ 11 января 2011

Кто-нибудь знает способ или имеет творческое представление о том, как получить UIImage, визуализируемый из UIWebView? Подвох в том, что он должен быть в фоновом потоке.

Я уточню: Я пытаюсь получить изображение из нескольких UIWebViews каждую секунду + - и отображать его на экране (iPhone, конечно). Поскольку рендеринг слоя в CGContext - это работа с ЦП, я не хотел бы использовать основной поток, чтобы не повесить пользовательский интерфейс.

Мои попытки до сих пор были:

  • Я пытался использовать renderInContext на слое webView до UIGraphicalContext, но ошибка _WebTryThreadLock привела к сбою веб-просмотров.

  • Я попытался создать CGBitmapContext и отобразить на нем слой веб-просмотра, но получил тот же результат.

  • Я попытался реализовать метод copy (добавив категорию) к CALayer, который глубоко копировал все публичные свойства и подслои. После этого я попытался renderInContext скопировать слой. Я получил UIImage, который был частично"правильный" - это означает, что не все слои были отрисованы, поэтому, например, я бы получил только заголовок веб-сайта (или нижний колонтитул, или тело, или панель поиска, или только некоторые из кадров). Слой UIWebview состоит из всех подклассов CALayers, поэтому, вероятно, этот подход не сработал.

  • Я попытался установить kCATransactionDisableActions в CATransaction, но, похоже, это не изменило это поведение (ни одного из них).

Я почти готов сдаться.

Есть ли среди вас спаситель?

Ответы [ 2 ]

4 голосов
/ 11 января 2011

UIWebView ненавидит, и я имею в виду действительно ненавидит , когда что-то с ним делается в фоновом потоке. UIKit не является полностью потокобезопасным. Рисование в графическом контексте (это было добавлено в iOS 4), но не создание UIViews во вторичном потоке.

Вы создаете свои UIWebViews из основного потока? Возможно, у вас есть какой-нибудь код, которым можно поделиться? Я подозреваю, что ваши проблемы вызваны тем, что вы пытаетесь выполнить операции с UIWebView во вторичном потоке. Операция рисования для отображения содержимого вида в виде изображения может произойти вне основного потока, но создание самого вида не может.

0 голосов
/ 29 июня 2011

Я тоже работал над этим.

В потоке я создаю иерархию представления, перебирая цикл до тех пор, пока веб-представление не завершит загрузку содержимого.

Веб-представление, которое я создаю, находится внутри viewdidload UIViewController - я пытался сделать

if ([NSThread isMainThread] == NO) {[self performselectorOnMainThread: @selector(viewDidLoad)return;)}

И я сделал то же самое для освобождения webView.

Но это не сработало ... Я только обнаружил, что мы избегаем исключений UIWebView, пока мы не попали в пул автоматического выпуска ...

Я использую инструменты, чтобы выяснить, почему .

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

...