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, sforzo e interessante come bene. – CodaFi
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. –
CodeFi Grazie. @DavidH Ho biforcato il tuo progetto e lo esaminerò per vedere cosa posso imparare da esso. Grazie. – Brennan