Domanda

Ho tutta una serie di modelli che si guardano per le modifiche. Quando un setter viene attivato, l'osservatore nel modello è chiamato e all'interno di quel modello che ho effettuare una chiamata a un server web le informazioni ed aggiornamento nel server web in modo da ha correttamente i dati dovrebbe.

Tuttavia, nella mia chiamata al server web posso tornare un errore per qualsiasi cosa, da essere il collegamento caduto, server di ripristinare ecc al server di dire l'aggiornamento non è stato permesso (per esempio qualche altro parametro è cambiato da un altro utente ha impedito l'aggiornamento ).

Oh le gioie di un archivio di dati disconnessi ...

C'è un modo che io possa aggiornare self (vale a dire il modello) senza ri-innescare un'azione KVO?

ho potuto spegnere l'osservatore quando torno la risposta, ma un'altra azione utente allo stesso oggetto è possibile mentre è in corso la richiesta di server in background. Questo sarebbe poi rompere l'altra chiamata.

qui per una spiegazione di quello che ero cercando di fare per ottenere l'osservazione accadendo in primo luogo, e un esempio di codice del modello completo.

La parte dove io sto facendo la chiamata sarebbe l'osservatore come segue:

-(void)observeValueForKeyPath:(NSString *)keyPath
                 ofObject:(id)object
                   change:(NSDictionary *)change
                  context:(void *)context {

  if ([keyPath isEqual:@"firstName"]) {

    if !([serverCall value:[change objectForKey:NSKeyValueChangeNewKey] 
                    forKey:@"firstName"]) {

        // Notify the user of the problem and somehow do a 
        // [self setFirstName:[change objectForKey:NSKeyValueChangeOldKey]]
        // without firing off a KVO which would only loop this process
    }
  }

  if ([keyPath isEqual:@"lastName"]) {
    // Do whatever I need to do
  }
}

Voi ragazzi sembrano sempre venire attraverso su qualche consiglio buono e io sono sempre grato per qualsiasi suggerimento si può avere.

È stato utile?

Soluzione

Bene ho finito per prendere una strada diversa. Invece di basarsi sul modello a oggetti di inviare gli aggiornamenti, ho preso tutto di un livello e lasciare che il manico di controllo degli aggiornamenti.

In sostanza il processo è stato il seguente:

  1. Creare gli oggetti nel modello quando richiesto
  2. Dai setter nel controllore che teneva in una variabile metodo lo stato attuale delle impostazioni dell'oggetto
  3. Passata le nuove impostazioni al server, ma solo quelli che ha cambiato tra la le nuove impostazioni esistenti e (tutti i valori delta)
  4. Se la chiamata superato, aggiornare il modello o, se non è riuscito, informare l'utente e non fare niente altro

Ha funzionato essere un po 'più di codice in ogni controller, ma confrontando in modo dinamico i valori correnti con i nuovi valori e solo passando su quelli che avevano cambiato al server ho compiuto lo stesso risultato netto.

Questo mi permette di passare da una delle più valori basati su quanti cambiato senza dover setter hard-code e getter con una chiamata a un metodo di server API comune più e più volte.

L'effetto netto è che io continuo a tutte le notifiche mia KVC / KVO senza preoccuparsi di aggirare o no fare aggiornamenti KVC / KVO su alcune chiamate e non su altri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top