UIKit рисование потокобезопасно: как вы получаете графический контекст? - PullRequest
9 голосов
/ 31 марта 2012

Итак, как уже упоминалось в этом ответе и в заметках о выпуске iOS 4.0 , UIKit теперь имеет некоторые средства для поточно-ориентированного рисования:

Рисованиек графическому контексту в UIKit теперь является потокобезопасным.В частности:

  • Подпрограммы, используемые для доступа к графическому контексту и управления им, теперь могут корректно обрабатывать контексты, находящиеся в разных потоках.
  • Рисование строк и изображений теперь поточно-ориентировано.
  • Использование объектов цвета и шрифта в нескольких потоках теперь безопасно.

Это здорово, но как вы его используете?

Насколько далеконасколько я знаю, в любой момент, когда вы не внутри -drawRect:, вы можете рисовать только с помощью UIKit / UIGraphics, если вы создали собственный контекст с помощью UIGraphicsBeginImageContext() или UIGraphicsPushContext(), но эти функции не являются поточно-ориентированнымисогласно документации, -drawRect() всегда вызывается в главном потоке.

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

Итак, как мне использовать этот многопоточный материал для рисования на основе UIKit, который был представлен в iOS 4?Какие другие способы получения активного графического контекста UIKit я пропустил?

PS Я знаю, что я мог бы просто рисовать с использованием Core Graphics и покончить с этим.По разным причинам (устаревший код) я хотел бы продолжать использовать методы рисования на основе UIKit.

1 Ответ

8 голосов
/ 31 марта 2012

Мое убеждение, основанное на некотором опыте и опыте и различных документах, заключается в том, что документы для UIGraphicsPushContext() неверны.

Я считаю, что UIGraphicsPushContext() на самом деле потокобезопасен. Конкретным признаком того, что это правда, является QA1637 , который говорит: «Начиная с iOS 4.0, рисование в графическом контексте в UIKit является поточно-ориентированным. Это включает доступ к текущему графическому стеку и манипулирование им рисование изображений и строк, а также использование объектов цвета и шрифта из вторичных потоков. " (выделение мое)

Я признаю, что всегда рискованно предполагать безопасность потоков в противоречии с документами. Но я считаю, что это ошибка документации. Я открыл rdar: // 11161530 , чтобы отследить его. Пожалуйста, обманите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...