2012-07-18 11 views
15

Ho creato un progetto su GitHub per imparare come ottimizzare il networking per le mie app iOS. Ho usato i blocchi e GCD pesantemente e dopo aver visto i video e i video del WWDC del 2012 ho imparato che potrei essere in grado di fare di più con NSOperationQueue. Nello specifico, posso controllare il numero di operazioni simultanee (connessioni di rete) e fornire l'annullamento delle operazioni. Sto sperimentando le operazioni simultanee a 1, 2, 4, 8 e 16 e sto vedendo risultati interessanti che non mi aspettavo assolutamente. Sto misurando i risultati, ma mi chiedo se ci sia più che dovrei misurare.Come ottimizzare la rete su iOS?

Potete trovare il progetto di esempio qui:

https://github.com/brennanMKE/OptimizedNetworking

Dal momento che sto utilizzando l'API asincrona di NSURLConnection v'è abbondanza di vantaggio di avere molte connessioni simultanee perché l'API spende una discreta quantità di tempo in attesa di Pacchetti HTTP Precedentemente il mio codice iniziava con una serie di elementi da scaricare e li richiedeva tutti in sequenza, il che impedisce i vantaggi della concorrenza. Ho anche utilizzato le notifiche per annullare le connessioni di rete. Ora posso farlo con questo progetto attraverso le operazioni e le ho impostate per utilizzare un valore per priorità e una categoria in modo che sia possibile dare la priorità e ordinare i download e annullare una categoria di operazioni. Potrei scegliere di usare una categoria per ogni vista e quando un utente lascia una vista tutte le operazioni per quella vista saranno cancellate usando la categoria. Ciò libererà risorse per la vista attiva.

Una preoccupazione relativa all'utilizzo di più operazioni simultanee è l'utilizzo della CPU e l'I/O, ma non sono a conoscenza di un modo per misurare questi valori con iOS. L'equivalente del comando "w" in iOS per mostrare l'utilizzo della CPU potrebbe essere utile. Sono meno preoccupato per I/O ma la sua misurazione sarebbe più completa.

Il mio problema principale di come stavo facendo networking era un'interfaccia utente reattiva. Ho scoperto che ciò che ho fatto ha rallentato l'interfaccia utente. Questo nuovo approccio può essere di grande aiuto, ma solo se tengo giù il numero di operazioni concorrenti. Il numero ottimale di operazioni può variare in base al tipo di connessione (3G, WiFi, ecc.), Pertanto il controllo del tipo di connessione può portare ad alcune ottimizzazioni.

Se siete interessati a modi migliori per accelerare le comunicazioni di rete nella vostra app, provate questo esempio di progetto e suggerite altri modi in cui posso misurare le prestazioni e offrire modi per ottimizzare ulteriormente le comunicazioni. (Si noti inoltre che sto facendo riferimento al progetto di esempio Apple MVCNetworking e al progetto ASIHTTPRequest

Quello che potrei fare successivamente è sommare la quantità di dati scaricati e tenere un registro di tale importo insieme al tempo totale per completare il download.

il file README dovrebbe aiutare a spiegare il progetto e come funziona.

+1

+1, sforzo e interessante come bene. – CodaFi

+1

Se guardate il mio progetto su github, NSOperation-WebFetches-MadeEasy, c'è una classe helper che gestisce le operazioni per voi. Sto utilizzando questo codice esatto in due app nello store con grande successo e spesso aggiungo oltre 100 operazioni alla coda. Nota che iOS lavora a stretto contatto con NSOperationsQueue per gestire il carico. Non vedo mai alcun effetto sul thread principale dovuto. –

+0

CodeFi Grazie. @DavidH Ho biforcato il tuo progetto e lo esaminerò per vedere cosa posso imparare da esso. Grazie. – Brennan

risposta

3

Se questo aiuta Mugunth Kumar in realtà controlla il tipo di connessione utilizzando la classe raggiungibilità prima di impostare la dimensione di connessione NSOperationQueue max nel MKNetworkKit

+0

Secondo Quinn "the Eskimo" non dovresti basare la tua rete sul tipo di connessione (WiFi, 3G, Edge, ecc.) Ma dovresti piuttosto misurare la velocità di un download per decidere. Sono anche interessato a metriche per iPod, iPhone e iPad per il numero di operazioni simultanee. Controllerò MKNetworkKit. – Brennan

+0

Sebbene io tendo ad essere d'accordo, posso vedere il vantaggio di sapere in anticipo che siamo su una rete EDGE e la massima velocità di download richiederà probabilmente solo 1-2 code di operazioni di rete al massimo. Misurare la velocità d/l potrebbe aumentare questo primo controllo possibilmente. Se alcuni presupposti erano errati, possiamo apportare modifiche in base al throughput corrente. – IanStallings

+1

Con la mia app di esempio ho intenzione di monitorare le prestazioni per mostrare le statistiche per i vari scenari. Probabilmente metterò insieme qualcosa di Core Data per tenere un conto corrente dei risultati per consentire un riassunto di tutta la cronologia. Questo potrebbe rivelare modi per ottimizzare ulteriormente. – Brennan

Problemi correlati