La mia app scarica diverse risorse da descrittori di server, dati e dati. Questi download, attivati da azioni dell'utente, possono essere eseguiti contemporaneamente, diciamo, fino a 50 download alla volta. Tutti questi task asincroni finiscono per creare oggetti in memoria, (ad esempio aggiungendo foglie a strutture di dati, come l'aggiunta di chiavi a dizionari o oggetti mutabili agli array). La mia domanda è: può questo causare problemi di stabilità? Ad esempio, se diverse attività simultanee cercano di aggiungere chiavi allo stesso dizionario, dovrei gestire la situazione, inserendo una sorta di lucchetto? Se implemento un ciclo for che cerca elementi grafici in un array, è possibile che altre attività in esecuzione possano modificare il contenuto dell'array 'durante' il ciclo? Qualche riferimento o orientamento generale su questo multitasking, problemi di multithreading diversi dalla documentazione ufficiale?iOS: accesso simultaneo alle risorse di memoria
risposta
dipende da come avete a che fare con il download - se si utilizza NSURLConnection gestisce il threading/concorrenza separato per voi e il vostro codice è rientrante quindi non devi preoccuparti di azione simultanea. Se stai creando i tuoi thread hai potenzialmente problemi.
MODIFICA: Il codice viene eseguito in un thread principale (il ciclo di esecuzione principale), diciamo che si dispone anche di un NSURLConnection, che verrà eseguito in un thread separato. Tuttavia, il codice delegato relativo agli eventi che si verificano mentre la connessione è in esecuzione viene eseguito nel ciclo di esecuzione, non nell'altro thread. Questo significa che il tuo codice può eseguire solo una cosa alla volta. Un metodo di connessione riuscita non viene chiamato allo stesso tempo come qualsiasi altro codice. Se avessi un ciclo for in esecuzione, allora bloccherebbe il tuo thread principale fino a quando non ha terminato il ciclo, nel frattempo se la connessione è finita mentre il ciclo for è ancora in esecuzione, il tuo codice delegato non verrà eseguito fino al termine del ciclo.
Si consiglia di esaminare i blocchi di barriera e di Grand Central Dispatch (GCD). I blocchi di barriera ti permetteranno di fare ciò che vuoi in background e "bloccare" le risorse.
Controlla la documentazione Apple e il post sul blog di Mike Ash here su GCD.
L'essenziale è che si utilizza una coda concorrente creata per eseguire le letture e si utilizza un blocco di barriera per bloccare tutti gli accessi a quella risorsa per la scrittura. roba buona.
Buona fortuna
Tim
Sì, sto usando NSURLConnection. Immaginiamo di avere un ciclo su un array mutabile, cosa succede se un'altra attività (connessione riuscita) tenta di aggiungere un oggetto alla fine dell'array, mentre il ciclo for è in esecuzione? Potresti per favore fare un breve esempio di codice di rientro in questo caso? – user236739
Aggiunte altre frasi – Gruntcakes
Cool, queste nuove linee in cui davvero chiarire, grazie. – user236739