2009-08-19 11 views
7

Ho un'app IPhone che utilizza i servizi Web per ottenere dati da un server. Sto effettuando ogni chiamata al webservice in una sottoclasse NSOperation in modo che possa essere infilato. La mia domanda è, qual è il modo consigliato per passare informazioni da una sottoclasse di NSOperation completata. Attualmente sto inviando una NSNotification alla fine del mio metodo principale e qualsiasi codice che attenda il completamento di NSOperation, sottoscrive la notifica. E poi userò la parte oggetto di NSNotificationWithName: Object: per passare le informazioni indietro dall'operazione.Cacao - Restituire le informazioni da NSOperation

Non ero sicuro se ci fosse un modo migliore per farlo. Ho sentito parlare di Key Value Coding e quindi potrei usare Key Value Observing per rilevare quando la proprietà isFinished per l'operazione è cambiata, ma non sono sicuro di quale sia la migliore pratica.

Sto anche cercando di assicurarmi che la mia applicazione sia protetta da thread, che presumo non sarebbe un problema finché una mia notifica è stata inviata alla fine del metodo principale, quindi l'oggetto nella notifica sarebbe non sarà più usato nel thread da quando finirà.

Infine, sto chiamando la notifica in questo modo:

[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:[NSNotification notificationWithName:@"notificationName" object:dataObject] waitUntilDone:NO]; 

risposta

16

L'ho fatto personalmente in due modi. Entrambi hanno funzionato abbastanza bene.

primo modo

Si può avere una funzione che restituisce il "uscita", e vi invito che la funzione dopo l'operazione è terminata. È possibile osservare la chiave isFinished sull'oggetto NSOperation oppure utilizzare -[NSOperationQueue waitUntilAllOperationsAreFinished] per determinare quando l'operazione è terminata.

Secondo Modo

È possibile utilizzare un delegato o di destinazione/azione dal NSOperation. Assicurati che quando chiami la funzione delegato o attivi il target/azione, lo faccia sul thread principale usando -[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]

1

Dipende dalla vostra applicazione. Quante operazioni ti aspetti di eseguire contemporaneamente? Cosa stai facendo con il risultato? I risultati sono aggregati o devono essere visualizzati immediatamente nell'interfaccia utente?

L'invio di notifiche sulla filettatura principale è abbastanza pesante. A seconda di cosa stai facendo con il risultato, potresti soffocare la tua interfaccia utente. Dal punto di vista del design, gli oggetti che invierai dalla notifica saranno qualcosa che la classe osservante dovrebbe conoscere? Potrebbe essere più sensato apportare modifiche agli oggetti del modello dall'operazione e fare in modo che un oggetto controller osservi tali modifiche.

È possibile utilizzare Key Value Observing ma è necessario prestare attenzione. L'osservatore osserva nello stesso thread in cui si verifica il cambiamento, quindi non devi modificare l'interfaccia utente direttamente quando si osserva isFinished.

Se l'oggetto è di proprietà e utilizzato dall'operazione, allora sì, dovrebbe essere sicuro inviarlo alla fine del main. Sarà trattenuto dalla notifica.

0

Il documento dice che è meglio rendere la variabile membro dell'operazione quando vuoi ottenere il risultato da operazione. Ma non penso che la soluzione ti adatterà.

Penso che la notifica sia buona e che c'è un altro modo per ottenere il risultato è creare un blocco di completamento per la propria operazione.Vedi qui: Return data from NSOperation? Ho provato che funziona bene.

Ho provato un altro modo prima di impostare il blocco di completamento dell'operazione, e fare un riferimento debole all'operazione e rendere il risultato una proprietà di funzionamento. in modo da poter ottenere il risultato dell'operazione quando hai finito.

Ma il completamento non è affidabile, quando si annulla l'operazione anche il completamento è stato eseguito. quindi scegli il meglio per te.

+0

il documento è potrebbe piacerti. – frank

Problemi correlati