2012-03-11 14 views
9

Skonfigurowałem prosty schemat danych podstawowych, w którym obiekty przedmiotów są dodawane do obiektów listy. Po wygenerowaniu klas, podstawowe dane wygenerowały standardowe dodatki, w tym kilka sposobów dodawania elementów do listy (list.addItemsObjects i list.addItems :).Dostosowywanie rdzeni generowanych przez dane akcesorów

Chcę również dodać NSDate "dateendded" do każdej pozycji. Teraz mogłem ręcznie ustawić to za każdym razem, gdy utworzę obiekt, ponieważ dane podstawowe dostarczą mi elementu access.doced. Ale tak naprawdę wolałbym, żeby to było obsługiwane przez samą listę, ponieważ implementacja nigdy się nie zmieni. Za każdym razem, gdy wywołuję list.AddItemObject, chciałbym ustawić atrybut dateAdded elementu w tym samym czasie. Sądzę, że musiałbym zrobić to samo w odwrotności, aby item.setList również ustawił dateAdded.

Nie jestem pewien, jak to zrobić. Czy powinienem próbować przedefiniować istniejące podstawowe elementy generujące dane? Jeśli tak, jak mam to zrobić (czy jest jakiś sposób wywołania oryginalnej implementacji w moim niestandardowym kodzie, tak, aby była obsługiwana odwrotna relacja, i wszelkich innych podstawowych potrzeb dotyczących danych)? Czy jest jakiś lepszy sposób na dostosowanie tych metod?

Odpowiedz

8

Można zastąpić podstawowe obiekty do generowania danych. Musisz zwrócić uwagę na kilka specjalnych rzeczy, takich jak wywoływanie willChangeValueForKey i didChangeValueForKey, ale inne niż nadpisywanie akcesorów jest prawie takie samo jak zawsze.

Przeczytaj dokumentację Apple: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html

Jest to wyjaśnione jasno z dużą ilością przykładów. Zwróć uwagę na różnicę między relacjami jeden do jednego i jeden do wielu.

Nie trzeba wdrażać funkcji odwrotnej, odbywa się to za pomocą danych podstawowych. Jeśli zadzwonisz pod numer list.AddItem, automatycznie otrzymasz automatyczne połączenie z numerem item.setList.

Po prostu dodaj żądany kod do akcesora item.setList. W ten sposób zagwarantujesz, że za każdym razem, gdy element zostanie dodany do listy, data jest odpowiednio aktualizowana. Nie przejmuj się dostępami do list.

Twój kod byłoby coś jak:

- (void)setList:(List *)value 
{ 
    [self willChangeValueForKey:@"list"]; 
    [self setPrimitiveValue:[NSDate date] forKey:@"dateAdded"]; // use setValue:forKey: if you need KVO for dateAdded 
    [self setPrimitiveValue:value forKey:@"list"]; 
    [self didChangeValueForKey:@"list"]; 
} 

EDIT Dałem mu jeszcze jedną myśl, a może chcesz dowiedzieć się, co następuje:

Jeśli dostosować metody List (tj addItemObject), musisz również dostosować setItems. Ponadto, jeśli Twój przedmiot zostanie dodany do listy, która nie jest listą spersonalizowaną, Twój niestandardowy kod oczywiście nie jest wywoływany.

Z drugiej strony, jeśli dostosujesz metodę setList, kod zostanie oznaczony , a nie, jeśli nie ma żadnych zmian dla przedmiotu.

Na przykład, jeśli zadzwonisz

[list addItems:[NSSet setWithObject:item]]; 
[list addItemsObject:item]; 

to element za setList accessor zostanie wywołana tylko raz! Połączenia bezpośrednio do item.setList są zawsze wywoływane, nawet jeśli nic się nie zmieniło.

+0

Dziękuję. Przeszukałem ją i teraz przeczytałem w pełni. Jedna część nie widzę wspomnieć - czy muszę stosować te same dostosowania do odwrotnych akcesorów?Tj. Po dostosowaniu list.addItemObject, czy powinienem również dostosować element item.setList? –

+0

Zaktualizowałem moją odpowiedź na twoje pytanie. – JiaYow

+0

Dzięki, to było dużo, aby mnie skłonić. Zamiast prostszej setList, dodałem jednak moje modyfikacje do inverse, list.addItemsObject (odnosząc się do dokumentacji to-many). Odkryłem, że nie jest wywoływany, gdy wywołuję obiekt item.setList. –

Powiązane problemy