Ho bisogno di mettere in pausa una NSOperation in esecuzione che è stata inserita in un NSOperationQueue. Attualmente sto cancellando tutte le operazioni e riavviandole. Ma questo porterebbe a una sorta di duplicazione in termini di processo fatto. Ho provato con flag setSuspended di NSOperationQueue. Ma non sospende l'operazione. C'è una via d'uscita?Come posso mettere in pausa una NSOperation in NSOperationQueue?
risposta
vedono questo: Link
E qui dal apple docs:
Sospendere e code Ripresa Se si vuole emettere un arresto temporaneo per l'esecuzione delle operazioni, è possibile sospendere la coda operazione corrispondente usando il metodo setSuspended:
La sospensione di una coda non causa l'interruzione delle operazioni già in esecuzione durante le attività. Semplicemente impedisce che nuove operazioni vengano pianificate per l'esecuzione. È possibile sospendere una coda in risposta a una richiesta utente per sospendere qualsiasi lavoro in corso, poiché l'aspettativa è che l'utente possa eventualmente riprendere il lavoro.
Non ho provato questo, ma avrei probabilmente cominciare da qui:
- aggiungere una bandiera
isPaused
alNSOperation
sottoclasse - implementare un metodo di copia/spostamento per i dati del funzionamento
- se in pausa, (osservare questa modifica in
-main
) - creare una nuova operazione spostando lo stato dall'operazione in pausa a nuova operazione
- regolare la priorità per riordinare ordine di operazione nella coda, se ti piace
- aggiungere il clone alla coda
- ritorno da
-main
se in-main
nota che questo sarà solo sospenderlo. se vuoi davvero mettere in pausa e riprendere esplicitamente, avresti manualmente 'nuova operazione' quando vuoi riprendere.
ora, se stai osservando o hai dei completamenti speciali, allora avrai qualche altro problema. per casi semplici, sembra che questo approccio sembrerebbe funzionare correttamente.
Grazie! Ho provato ad implementare come dal tuo link. Ho aggiunto una nuova variabile chiamata "isPaused" all'interno di NSOperation e ogni volta che ho bisogno di mettere in pausa l'operazione, imposterò il suo valore su YES. All'interno di NSOperation controllerò regolarmente il valore di "isPaused". Ogni volta che lo trovo su "SÌ", interrompo il ciclo. Ma ho un problema serio qui. Sto cercando di impostare il valore di 'isPaused' dal thread principale. Questo potrebbe portare ad alcune condizioni di gara. C'è un modo per sbarazzarsi delle condizioni della gara? C'è un modo per chiamare i metodi (per mettere in pausa e riprendere) nello stesso thread (piuttosto che thread principale)? – Advaith
@Advaith: se entrambi i thread bloccano un mutex prima di leggere o scrivere in "isPaused", non dovrai preoccuparti delle gare. –