Sto tentando di creare un tipo di record che contiene valori univoci e che fungerà da oggetto di riferimento di destinazione per un altro tipo di record. Ad esempio, Record Type - Movies conterrà un elenco univoco di film inviati dagli utenti. E FavoriteMovies conterrebbe un riferimento di utenti e un riferimento di film. Gli utenti possono selezionare da un elenco di film esistenti o aggiungerne di nuovi.CloudKit - Come salvare il record se non esiste
Il problema si verifica se creo un nuovo record Film, mentre un altro utente crea un nuovo record con lo stesso nome (dopo aver recuperato l'elenco dei film, ma prima di tentare di aggiungerne uno nuovo). I due nuovi record sono considerati record diversi con recordID diversi. Ciò significa che una volta salvato il nuovo, ci saranno due istanze di Movies con il nome di salvataggio.
Non riesco a trovare un modo per eseguire un'operazione di salvataggio Se non esiste digitare il tipo di record di filmati. Potrei fare un salvataggio nel completamentoBlocco di una query, ma quelle due azioni non sarebbero una transazione atomica per garantire l'unicità. Per quanto ne so questo è anche il caso di concatenare CKQueryOperation
con CKModifyRecordsOperation
.
C'è un modo per inserire un record solo se il valore non esiste in una singola transazione?
Purtroppo questo non funziona per me. Sto creando una nuova istanza di movieRecord da aggiungere alla lista. Se un altro utente ha creato un record con lo stesso nome (dopo aver recuperato l'elenco dei film, ma prima di tentare di aggiungerne uno nuovo), vengono considerati record diversi poiché hanno recordID diversi. Ciò significa che anche se il mio savePolicy è impostato su IfServerRecordUnchanged, l'operazione non genera un errore. Invece vedrei due dischi diversi con lo stesso nome. – Denis
Capito. Funzionerebbe se hai fatto movieRecord.recordID.recordName il nome del film. Ho un caso d'uso simile usando il database pubblico e questo è quello che sto facendo per mantenere unici i record pubblici. Ho apportato una modifica alla risposta per notare quell'ipotesi. –
Buona idea, questo lavoro lo farà per me. Grazie! – Denis