2011-08-28 4 views
86

Cari brava gente di StackOverflow,NSDefaultRunLoopMode vs NSRunLoopCommonModes

Proprio come l'ultima volta, con la presente apparire una domanda ho recentemente inciampare su. Spero che qualcuno là fuori possa far luce su di me.

Ogni volta che provo a scaricare un file grande dietro UIScrollView, MPMapView o qualcosa del genere, il processo di download viene interrotto non appena tocco lo schermo dell'iPhone. Per fortuna, un fantastico post sul blog di Jörn suggerisce un'opzione alternativa, usando NSRunLoopCommonModes per la connessione.

che viene mi guardo nel dettaglio delle due modalità, NSDefaultRunLoopMode e NSRunLoopCommonModes, ma il documento Apple non gentilmente spiegare, altro che dire

NSDefaultRunLoopMode

Il modo di trattare con le sorgenti di ingresso di altri rispetto agli oggetti NSConnection. Questa è la modalità di esecuzione più comunemente utilizzata.

NSRunLoopCommonModes

oggetti aggiunti a un ciclo di esecuzione utilizzando questo valore come modalità sono monitorati da tutti i modi di loop di esecuzione che sono stati dichiarati un membro del set di modalità “comuni", vedi la descrizione dei CFRunLoopAddCommonMode per i dettagli.

CFRunLoopAddCommonMode

Fonti, timer s, e gli osservatori vengono registrati in una o più modalità di ciclo di esecuzione e vengono eseguiti solo quando il ciclo di esecuzione è in esecuzione in una di queste modalità. Le modalità comuni sono un insieme di modalità del ciclo di esecuzione per cui è possibile definire un insieme di sorgenti, timer e osservatori che sono condivisi da queste modalità. Invece di registrare un'origine, ad esempio, per ciascuna modalità di esecuzione specifica, è possibile registrarla una volta nella pseudo modalità comune del ciclo di esecuzione e verrà automaticamente registrata in ciascuna modalità di ciclo di esecuzione nella serie di modalità comune. Allo stesso modo, quando una modalità viene aggiunta al set di modalità comuni, tutte le sorgenti, i timer o gli osservatori già registrati alla pseudo modalità comune vengono aggiunti alla modalità comune appena aggiunta.

Qualcuno può spiegare per favore i due in linguaggio umano?

risposta

164

Un ciclo di esecuzione è un meccanismo che consente al sistema di attivare i thread dormienti in modo che possano gestire eventi asincroni. Normalmente quando si esegue un thread (ad eccezione del thread principale) esiste un'opzione per avviare il thread in un ciclo di esecuzione o meno. Se il thread esegue un ordinamento o un'operazione di lunga durata senza interazione con eventi esterni e senza timer, non è necessario un ciclo di esecuzione, ma se il thread deve rispondere agli eventi in entrata, deve essere collegato a un ciclo di esecuzione per sveglia la discussione quando arrivano nuovi eventi. Questo è il caso dei thread generati da NSURLConnection, poiché si attivano solo sugli eventi in entrata (dalla rete).

Ciascun thread può essere associato a più cicli di esecuzione o può essere associato a un ciclo di esecuzione specifico che può essere impostato per funzionare in modalità diverse. Una "modalità ciclo di esecuzione" è una convenzione utilizzata dal sistema operativo per stabilire alcune regole su quando consegnare determinati eventi o raccoglierli per essere consegnati successivamente.

In genere tutti i loop di esecuzione sono impostati sulla "modalità predefinita" che stabilisce un modo predefinito per gestire gli eventi di input.Ad esempio: non appena si verifica un evento di trascinamento del mouse (Mac OS) o touch (su iOS), la modalità per questo ciclo di esecuzione viene impostata sul tracciamento degli eventi; ciò significa che il thread non verrà riattivato su nuovi eventi di rete ma questi eventi verranno consegnati in seguito quando l'evento di input dell'utente termina e il ciclo di esecuzione è nuovamente impostato sulla modalità predefinita; ovviamente questa è una scelta fatta dagli architetti dell'OS per dare priorità agli eventi utente invece degli eventi in background.

Se si decide di cambiare la modalità di ciclo di esecuzione per il tuo thread NSURLConnection, utilizzando scheduleInRunLoop:forModes:, allora è possibile assegnare il filo ad uno speciale circuito di corsa modalità, piuttosto che la specifica del ciclo di esecuzione predefinito. La speciale pseudo-modalità chiamata NSRunLoopCommonModes viene utilizzata da molte fonti di input, incluso il tracciamento degli eventi. Ad esempio, l'assegnazione dell'istanza di NSURLConnection alla modalità comune significa che associa i suoi eventi a "modalità di tracciamento" oltre alla "modalità predefinita". Un vantaggio/svantaggio di associare i thread con NSRunLoopCommonModes è che il thread non verrà bloccato dagli eventi di tocco.

Nuove modalità possono essere aggiunte alle modalità comuni, ma questa operazione è piuttosto di basso livello.

Vorrei chiudere con l'aggiunta di alcune note:

  • In genere abbiamo bisogno di utilizzare una serie di immagini o miniature scaricati dalla rete con una vista tabella. Potremmo pensare che lo scaricando queste immagini dalla rete mentre la vista tabella è lo scorrimento potrebbe migliorare l'esperienza dell'utente (poiché potremmo vedere le immagini mentre lo scorrimento ), ma questo non è vantaggioso poiché la scorrevolezza dello scrolling può soffrire molto. In questo esempio con NSURLConnection non si dovrebbe utilizzare un ciclo di esecuzione; sarebbe preferibile utilizzare i metodi delegati UIScrollView per rilevare quando lo scorrimento è terminato e quindi aggiornare la tabella e scaricare nuovi elementi dalla rete;

  • È possibile considerare l'utilizzo di GCD che consente di "proteggere" il codice dai problemi di gestione del ciclo di esecuzione. Nell'esempio sopra riportato, è possibile prendere in considerazione l'aggiunta delle richieste di rete a una coda seriale personalizzata per .

+6

Caro Viggio24, grazie mille per questa spiegazione pulita e precisa. Chiederei ad Apple di includere il tuo commento nella guida API. ;) – Stkim1

+0

Ho upvoted la tua risposta perché è assolutamente chiaro !! Grazie per avere condiviso le tue conoscenze. –

+3

** la risposta di viggio24 ** è perfetta. Per chi fosse interessato, vorrei sottolineare che ** Session 208 (App di rete per iPhone OS, parte 2) ** del WWDC 2010 contiene un'introduzione sui loop di esecuzione. Se sei interessato dai un'occhiata. Spero che sia d'aiuto. –