2013-08-27 9 views

risposta

13

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!

+0

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. –

+0

@KunalBalani Controllare la mia modifica – Amar

+0

Vedere http://stackoverflow.com/questions/21139300/having-uiview-drawrect-occur-in-a-background-thread –

-1

Perché si desidera che l'utente sia in grado di vedere le modifiche dell'interfaccia utente nel momento in cui si verificano. Se dovessi essere in grado di eseguire modifiche all'interfaccia utente in un thread in background e visualizzarle al termine, sembrerebbe che l'app non funzioni correttamente.

Tutte le operazioni non-UI (o almeno quelli che sono molto costosi, come il download di cose o fare query di database) dovrebbe avvenire su un thread in background, mentre tutti interfaccia utente cambia deve accadere sempre sul filo principale per fornire la fluidità di un'esperienza utente possibile.

Non so come sia in C# per le app Windows Phone, ma mi aspetto che sia lo stesso. Su Android il sistema non ti consente nemmeno di fare cose come il download sul thread principale, permettendoti di creare direttamente un thread in background.

Come regola generale, quando si pensa al thread principale, pensare "a ciò che l'utente vede".

1

C# si comporta allo stesso modo (vedere ad esempio: Keep the UI thread responsive). Gli aggiornamenti dell'interfaccia utente devono essere eseguiti nel thread dell'interfaccia utente. La maggior parte delle altre operazioni dovrebbero essere eseguite in background.

Se questo non sarebbe il caso ci sarebbe probabilmente un inferno la sincronizzazione tra tutti gli aggiornamenti che devono essere fatte nell'interfaccia utente ...

-1

Ogni sistema, ogni biblioteca, ha bisogno di essere preoccupato per la sicurezza dei thread e deve fare cose per garantire la sicurezza del filo, mentre allo stesso tempo si occupa anche della correttezza e delle prestazioni.

Nel caso dell'interfaccia utente iOS e MacOS X, è stata presa la decisione di rendere sicuro il thread dell'interfaccia utente consentendo solo ai metodi dell'interfaccia utente di essere richiamati ed eseguiti sul thread principale. E questo è tutto.

Poiché ci sono molte cose complicate che richiedono almeno la serializzazione per evitare che si verifichi il caos totale, non vedo molto guadagnato dal consentire l'interfaccia utente su un thread in background.

1

da: https://www.objc.io/issues/2-concurrency/thread-safe-class-design/

Si tratta di una decisione di progettazione consapevole da parte di Apple di non avere UIKit essere thread-safe. Rendendola thread-safe non ti comprerei molto in termini di prestazioni; in effetti renderebbe molte cose più lente. E il fatto che UIKit sia legato al thread principale rende molto facile scrivere programmi concorrenti e usare UIKit. Tutto quello che devi fare è assicurarti che le chiamate su UIKit siano sempre fatte sul thread principale.

Quindi, in base a ciò, il fatto che gli oggetti UIKit siano accessibili sul thread principale è una decisione progettuale di Apple per favorire le prestazioni.

+0

Non sono d'accordo con questo. Queste sono tutte le piattaforme tra cui Symbian, Android, Blackberry e la maggior parte di esse esiste prima di iOS. Anche i servlet Java e altri strumenti GUI hanno questo. Non sono limitati alla piattaforma mobile. –