2015-06-17 13 views
9

Podczas sesji wideo WWDC15, 'What's New in Core Data' o 10:45 min (w prezentacji) inżynier Apple opisuje nową funkcję konstruktora modeli, która pozwala określić unikalne właściwości. Po ustawieniu tych unikatowych właściwości, dane podstawowe nie utworzą zduplikowanego obiektu z tą właściwością. Ma to na celu wyeliminowanie konieczności sprawdzania, czy identyczny obiekt przed utworzeniem nowego obiektu.W jaki sposób zaimplementować nową właściwość "unikatowy" konstruktora modelu Core Data w iOS 9.0 Beta

Eksperymentowałem z tym, ale nie miałem szczęścia, aby zapobiec tworzeniu nowych obiektów o identycznych "unikalnych" właściwościach (duplikaty obiektów). Poza 5-minutowym wyjaśnieniem wideo, nie znalazłem żadnych innych informacji opisujących, jak korzystać z tej funkcji.

enter image description here

Czy ktoś ma jakieś doświadczenia wdrażającego „niepowtarzalny” atrybut nieruchomości w rdzeniu Data Model?

+1

Nie mogę tego również użyć. Właściwość "Unikalny" w ustawieniach jednostki została zmieniona na "Ograniczenia" również –

+1

Właśnie napisałem [wpis na blogu na ten temat] (http://dorianroy.com/blog/2015/09/how-to-implement-unique -ograniczenia-w-core-danych-z-ios-9 /) –

Odpowiedz

-1

nie wiem właściwą odpowiedź, ponieważ jest to wersja beta, ale po zagraniu z nim przez chwilę znalazłem sposób, aby to działało:

  1. Powiedz modelu, który przypisuje formularz wyjątkowe ograniczenie, dokładnie tak, jak pokazano na obrazku, który masz w swoim pytaniu.

  2. Dodaj nowy rekord:

let newTag = NSEntityDescription.insertNewObjectForEntityForName("Tag", inManagedObjectContext: context) as! Tag
  1. Przypisywanie wartości do attribues.

  2. zapisać zmiany:

do { 
    try context.save() 
} catch let error as NSError { 
    print("Error: \(error.localizedDescription)") 
    context.reset() 
}

Klucz jest w bloku catch. Jeśli wystąpi błąd, zresetuj kontekst do poprzedniego stanu. Ponieważ operacja składowania zakończy się niepowodzeniem, nie będzie tam duplikatów.

Należy zauważyć, że należy sprawdzić, czy błąd nie został spowodowany przez zduplikowany rekord.

Mam nadzieję, że to pomoże.

11

Krótka odpowiedź: Musisz dodać tę linię do danych Core kodu konfiguracji stosu:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

Długa odpowiedź: Walczyłem z tym przez jakiś czas, ale myślę, że zorientowali się już teraz:

Unikalne więzy (UC) nie zapobiegają tworzeniu duplikatów w kontekście. Tylko przy próbie zapisania tego kontekstu dane podstawowe sprawdzają wyjątkowość jednostek UC.

Jeśli wykryje więcej niż jeden obiekt o tej samej wartości dla UC, domyślnym działaniem jest zgłoszenie błędu, ponieważ domyślną zasadą scalania dla konfliktów jest NSErrorMergePolicyType. Ten błąd zawiera obiekty będące w konflikcie w jego userInfo.conflictList, więc można ręcznie rozwiązać konflikt.

Jednak przez większość czasu prawdopodobnie chcesz użyć jednego z innych merge policies zamiast tego i pozwolić Core Data automatycznie scalać konflikty. Te zasady scalania istniały wcześniej, służą do konfliktów między obiektami w różnych kontekstach. Być może dlatego nie zostały wymienione w kontekście funkcji UC w WWDC Session 220. Zwykle właściwym wyborem jest NSMergeByPropertyObjectTrumpMergePolicy. Zasadniczo mówi "nowe dane przeważają nad starymi danymi", co jest potrzebne we wspólnym scenariuszu podczas importowania nowych danych z zewnętrznych źródeł.

(Porada: Najpierw miałem problemy z weryfikacją tego zachowania, ponieważ zduplikowane obiekty wydają się pozostawać w kontekście, dopóki operacja składowania nie zostanie zakończona - co w moim przypadku wydarzyło się asynchronicznie w kolejce tła, więc jeśli pobierzesz/policzysz obiekty zaraz po naciśnięciu przycisku zapisu, nadal możesz zobaczyć duplikaty.)

+0

Dzięki za szczegółową odpowiedź i na blogu :). Zauważyłem, że "PropertyObjectTrumpMergePolicyType" przerwie związek z innymi podmiotami (w przeciwieństwie do tego, o czym wspomniałeś w poście na blogu). Czy posiadasz próbkę lub próbkę kodu, która udowodni, że relacje nie zostały naruszone dzięki tej zasadzie scalania? –

+0

Ktoś wspomniał o tym na Twitterze kilka dni temu. Być może nastąpiła zmiana w ostatnich wersjach systemu operacyjnego. Od tego czasu nie używałem tej funkcji. Ale domyślam się, że zachowanie może zależeć od reguły usuwania relacji. Proponuję, abyś zgłosił swoje wrażenia w komentarzach bloga lub otworzyć nowe pytanie tutaj. –

Powiązane problemy