Sto sviluppando un'applicazione per iPad e attualmente sto cercando di trovare il miglior approccio al multithreading. Consentitemi di illustrare questo con un esempio semplificato:
Ho una vista con 2 sottoview, un raccoglitore di directory e una galleria con le anteprime di tutte le immagini nella directory selezionata. Poiché il "download" e la generazione di queste miniature possono richiedere un po 'di tempo, ho bisogno del multithreading in modo che l'interazione e l'aggiornamento della vista non vengano bloccati.Il migliore approccio multithreading nell'obiettivo C?
Questo è ciò che ho già provato:
[auto performSelectorInBackground: @selector (displayThumbnails :) withObject: CurrentFolder];
Questo ha funzionato correttamente perché le interazioni dell'utente non sono state bloccate, tuttavia fallisce miseramente quando l'utente tocca un'altra cartella mentre la prima cartella è ancora in fase di caricamento. Due thread stanno tentando di accedere alla stessa vista e alle stesse variabili che si traducono in problemi di esecuzione reciproca. Quando gli utenti toccano un'altra cartella, lo displayThumbnails
della cartella attualmente in caricamento dovrebbe essere interrotto. Non ho trovato un modo per fare questo ..
NSThreads
ho provato questo, ma ha lottato con quasi gli stessi problemi con il primo metodo, non ho trovato un modo (facile) per annullare la metodo in corso. (Sì, so di [aThread cancel]
ma non ho trovato un modo per 'riprendere' il thread). Forse dovrei sottoclasse NSThread
e implementare i miei metodi isRunning etc? Ma non c'è un modo migliore o una terza (o addirittura la quarta e quinta) opzione che sto trascurando?
Penso che questo sia un esempio abbastanza semplice e penso che ci sia forse una soluzione migliore senza sottoclasse NSThread
. Quindi, cosa faresti? Le vostre opinioni per favore!
Apparentemente non riesco a dare una risposta che legga solo "GCD" – JustSid
Si sbaglia completamente. Sul serio. – puzzle
Vedere [here] (https://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html%23//apple_ref/doc/uid/TP40008091-CH102-SW2) perché GCD è così bello :) O ancora meglio, guarda una delle sessioni WWDC :) Informazioni sul tuo problema originale: Esistono vari modi per annullare o mettere in pausa, indipendentemente dall'utilizzo di thread, GCD o NSOperationQueue. Puoi dormire, sospendere, attendere un blocco, annullare completamente, ecc. Penso che NSOperationQueue sarà una buona soluzione per te in questo momento perché ti guida automaticamente verso un'implementazione ragionevole. – puzzle