In Cocoa Touch, UIApplication
т. Е. Экземпляр приложения прилагается к основному потоку, потому что этот поток создается UIApplicatioMain()
, функцией точки входа Cocoa Touch. Он устанавливает основной цикл событий, включая цикл запуска приложения, и начинает обработку событий. Основной цикл событий приложения получает все события пользовательского интерфейса т.е. прикосновения, жесты и т.д.
От Docs UIApplicationMain()
,
Эта функция инициализирует объект приложения из основного класса и инициализирует делегат (если таковые имеются) от данного класса и задает делегат для приложения. Он также устанавливает основной цикл событий, включая цикл запуска приложения, и начинает обработку событий. Если файл Info.plist приложения указывает основной загружаемый файл nib, включая ключ NSMainNibFile и действительное имя файла nib для значения, эта функция загружает этот файл nib.
Эти события пользовательского интерфейса приложения дополнительно направлены UIResponder
«s после цепи респондеров обычно как UIApplication
->UIWindow
->UIViewController
->UIView
-> подвиды (UIButton
и др.)
ответчики обрабатывать события например, нажатие кнопки, кратковременное нажатие, увеличение зума, салфетки и т. д., которые переводится как изменение в пользовательском интерфейсе. Следовательно, поскольку вы можете видеть, что эта цепочка событий встречается в основном потоке, поэтому UIKit
, структура, содержащая респондентов, должна работать в основном потоке.
С снова UIKit
документов,
По большей части, классы UIKit должны использоваться только из основного потока приложения. Это особенно справедливо для классов, полученных из UIResponder, или для управления пользовательским интерфейсом вашего приложения.
EDIT
Почему DrawRect должен быть на главном потоке?
drawRect:
вызывается UIKit
как часть жизненного цикла UIView
«ы. Итак, drawRect:
привязан к основной теме. Рисование таким образом дорого, потому что это делается с использованием центрального процессора. Аппаратное ускорение графики обеспечивается с помощью технологии CALayer (Core Animation).
CALayer
с другой стороны выступает в качестве резервного хранилища для представления. После этого представление просто отобразит кэшированное растровое изображение текущего состояния. Любое изменение свойств вида приведет к изменениям в хранилище резервных копий, которые будут выполняться графическим процессором на резервной копии. Тем не менее, представление по-прежнему должно обеспечивать исходный контент и периодически обновлять представление. Я не работал над OpenGL, но я думаю, что он также использует слои (я мог ошибаться).
Я попытался ответить на это, насколько мне известно. Надеюсь, это поможет!
Я согласен с тем, что вы сказали. Предположим, что ответчик находится в основном потоке, и нам нужен основной поток для получения событий, но как насчет рендеринга UIView? Зачем нам нужен drawRect в основном потоке. Многие чертежи также могут быть выполнены и оптимизированы с помощью muti-threading, почему инфраструктура UIKit не позволяет это? Кроме того, я думаю, что UIKIt ускорен GPU, который использует многопоточность. Возможно, я ошибаюсь. –
@KunalBalani Пожалуйста, проверьте мои изменения – Amar
См. Http://stackoverflow.com/questions/21139300/having-uiview-drawrect-occur-in-a-background-thread –