2013-01-25 2 views
7

NSMergeByPropertyObjectTrumpMergePolicy e NSOverwriteMergePolicy è lo stesso in una cosa. La proprietà sovrascrive quella nel negozio.Che cos'è un conflitto in NSManagedObject e qual è la differenza tra alcuni dei criteri di unione?

Quindi qual è il diverso tra loro? In tutti i casi a cui riesco a pensare, indipendentemente dal fatto che quello presente nell'archivio permanente sia stato modificato o meno, la proprietà sostituisce l'archivio permanente.

Anche cos'è il conflitto?

Pensavo che conflitto significasse semplicemente che i dati sono diversi. Questo significa che i dati di base sono stati originariamente progettati in modo che una volta scritti i dati non possano essere aggiornati?

Se il conflitto è qualcosa di diverso dai semplici "dati diversi", qual è la differenza tra NSOverwriteMergePolicy e NSErrorMergePolicy?

In entrambi i casi, la semplice differenza di dati non è comunque un conflitto e quindi non può esserci conflitto.

risposta

10

Ciò significa che i dati di base sono stati originariamente progettati affinché una volta scritti i dati non possano essere aggiornati?

No. Non sarebbe molto utile se fosse così, vero?

Inoltre, cos'è il conflitto?

Nei dati di base può verificarsi un conflitto quando si dispone di più di un oggetto gestito contesto (MOC) che accede allo stesso archivio dati. Questo è comune nelle app con multithreading. Ogni MOC può salvare le modifiche indipendentemente dall'altra. Ma si desidera mantenere una visione coerente dei dati attraverso tutti i thread, quindi è possibile ricevere una notifica che le modifiche sono state salvate su un MOC e unire tali modifiche in un contesto diverso. Ciò mantiene i contesti in sincronia.

Ma cosa succede se si tenta di unire le modifiche in un MOC e ha diverse modifiche non salvate agli stessi dati? Ad esempio, entrambi i MOC hanno modificato lo stesso attributo nella stessa istanza e lo hanno modificato in valori diversi. Questo è quando si verifica un conflitto. Se si tenta di unire le modifiche, i risultati dipendono dal criterio di unione MOC. Per impostazione predefinita utilizza NSErrorMergePolicy, il che significa che l'unione non riesce e il codice deve risolvere il conflitto in qualche modo. Esistono diverse politiche di unione incorporate che applicano diversi schemi di risoluzione automatica al conflitto.

I quattro schemi di risoluzione incorporati danno priorità alle modifiche sul disco o alle modifiche in memoria. Si differenziano anche per il modo in cui gestiscono le modifiche in memoria non conflittuali. Ad esempio, NSMergeByPropertyStoreTrumpMergePolicy aggiorna eventuali modifiche in conflitto nella memoria per far corrispondere le modifiche degli altri MOC, ma lascia in atto modifiche non in conflitto. NSRollbackMergePolicy differisce dal fatto che elimina completamente le modifiche in memoria, anche se non sono in conflitto con le nuove modifiche dagli altri MOC. Puoi anche creare le tue politiche di fusione se nessuno degli schemi integrati sembra giusto.

In entrambi i casi, la semplice differenza di dati non è comunque un conflitto e quindi non può esserci conflitto.

Certamente possono esserci conflitti. È uno scenario molto comune.

+0

Quindi la chiave qui è che la semplice differenza di dati non è un conflitto.È la differenza di dati non salvata sullo stesso oggetto che diventa un conflitto. –

+0

A destra, se uno dei contesti dell'oggetto gestito non ha modifiche per un attributo, una modifica da un MOC diverso non è un conflitto: sono solo nuove informazioni. –

+0

Questa è la chiave. Grazie. –