In Cocoa Touch, UIApplication
, ad esempio, l'istanza dell'applicazione è collegata al thread principale poiché questa thread è creata da UIApplicatioMain()
, la funzione del punto di ingresso di Cocoa Touch. Imposta il ciclo degli eventi principale, compreso il ciclo di esecuzione dell'applicazione, e inizia l'elaborazione degli eventi. ciclo di eventi principale di applicazione riceve tutti gli eventi dell'interfaccia utente cioè tocco, gesti ecc
Da docs UIApplicationMain()
,
Questa funzione crea un'istanza dell'oggetto applicazione dalla classe capitale e crea un'istanza del delegato (se presente) dalla data classe e imposta il delegato per l'applicazione. Imposta anche il ciclo degli eventi principale, incluso il ciclo di esecuzione dell'applicazione, e inizia l'elaborazione degli eventi. Se il file Info.plist dell'applicazione specifica un file di pennino principale da caricare, includendo la chiave NSMainNibFile e un nome file di pennino valido per il valore, questa funzione carica il file di pennino.
Questi eventi applicazione dell'interfaccia utente sono ulteriormente inoltrati a UIResponder
s' seguendo la catena di responder solito come UIApplication
->UIWindow
->UIViewController
->UIView
-> subviews (UIButton
, ecc.)
Responder gestiscono eventi come premere il pulsante, toccare, pizzicare lo zoom, scorrere il dito ecc. che viene tradotto come modifica nell'interfaccia utente. Quindi come si può vedere questa catena di eventi si verifica sul thread principale ed è per questo che UIKit
, il framework che contiene i responder dovrebbe operare sul thread principale.
Da documenti ancora UIKit
,
Per la maggior parte, classi UIKit deve essere utilizzato dal thread principale di un'applicazione. Ciò è particolarmente vero per le classi derivate da UIResponder o che implicano la manipolazione dell'interfaccia utente dell'applicazione in alcun modo.
EDIT
Perché drawRect ha bisogno di essere sul thread principale?
drawRect:
è chiamato da UIKit
come parte del ciclo di vita UIView
s'. Quindi drawRect:
è associato al thread principale. Disegnare in questo modo è costoso perché è fatto usando la CPU sul thread principale. L'hardware per accelerare la grafica è fornito utilizzando la tecnica CALayer (Core Animation).
CALayer
d'altra parte funge da supporto per la visualizzazione. La vista mostrerà solo la bitmap memorizzata nella cache del suo stato corrente. Qualsiasi modifica alle proprietà della vista comporterà modifiche nel backing store che vengono eseguite dalla GPU sulla copia di backup. Tuttavia, la vista deve ancora fornire il contenuto iniziale e aggiornare periodicamente la vista. Non ho davvero lavorato su OpenGL ma penso che usi anche i livelli (potrei sbagliarmi).
Ho cercato di rispondere a questo al meglio delle mie conoscenze. Spero possa aiutare!
Sono d'accordo sulla maggior parte di ciò che hai detto. Supponiamo che il risponditore sia sul thread principale e che abbiamo bisogno del thread principale per ricevere gli eventi, ma per quanto riguarda il rendering di UIView? Perché abbiamo bisogno di drawRect sul thread principale. Un sacco di disegno potrebbe anche essere eseguito e ottimizzato da muti-threading perché il framework UIKit non lo consente? Inoltre, penso che UIKIt sia accelerato dalla GPU che usa il multithreading. Potrei sbagliarmi su questo. –
@KunalBalani Controllare la mia modifica – Amar
Vedere http://stackoverflow.com/questions/21139300/having-uiview-drawrect-occur-in-a-background-thread –