2009-09-28 12 views
8

Czy istnieje sposób zainicjowania zarządzanego obiektu poza kontekstem. Zasadniczo próbuję przydzielić/najpierw zainicjować obiekt zarządzany poza kontekstem, a następnie dowiedzieć się, czy naprawdę chcę wstawić obiekt, a następnie wprowadzić go do magazynu danych przy użyciu istniejącego kontekstu obiektu zarządzanego.Dane podstawowe iPhone'a: ​​Inicjowanie obiektu zarządzanego bez kontekstu

Czy to możliwe, czy też jest sprzeczne z zamierzonym wykorzystaniem danych podstawowych?

Odpowiedz

5

Zarządzany obiekt jest "zarządzany" przez kontekst, dlatego nie można go naprawdę zainicjować przy użyciu alokacji, ponieważ nie są one przeznaczone. Jednak tworzenie instancji zarządzanego obiektu przez kontekst nie trwa dopóki nie zostanie wywołana metoda zapisu w kontekście, aby uzyskać ten sam efekt, używając kontekstu do zainicjowania go i tylko do oszczędzania, gdy zorientujesz się, że naprawdę chcesz użyć tego obiektu.

+0

Pomyślałem nawet, po prostu chciałem, aby potwierdzić, że to był przypadek. Dziękuję, Daniel. – WillF

2

Nie, nie można utworzyć instancji o numerze NSManagedObject poza NSManagedObjectContext (cóż, możesz, ale złe rzeczy się wydarzą, a Twój program prawie na pewno nie zadziała tak, jak miałeś nadzieję). Można jednak utworzyć NSInMemoryPersistentStore -backed NSManagedObjectContext. To trochę więcej konfiguracji (niewiele) i wszystko znika, gdy dealloc magazynu w pamięci. W międzyczasie zyskujesz wszystkie zalety zarządzania grafiką obiektów Core Data.

0

Do czego prawdopodobnie strzelasz to wiele kontekstów. Możesz utworzyć dodatkowy kontekst "scratchpad", a następnie scalić wszelkie zmiany z powrotem w głównym kontekście. Jeden z przykładowych projektów Apple iPhone'a realizuje dokładnie to. Będziesz musiał zalogować się do centrum deweloperów, aby je znaleźć.

1

Dla każdego, kto natyka się na to pytanie, oto jak osiągnąłem co OP został prawdopodobnie będzie za:

NSManagedObjectContext *moc = AppDelegate.managedObjectContext; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyModel" 
    inManagedObjectContext:moc]; 
MyModel *model = [[MyModel alloc] initWithEntity:entity 
    insertIntoManagedObjectContext:nil]; 
+1

Byłbym nieufny przy użyciu tego, jeśli MOCs są tworzone przy użyciu czegokolwiek poza domyślnym NSConfinementConcurrencyType - NSPrivateQueueConcurrencyType lub NSMainQueueConcurrencyType może prowadzić do problemów z właściwościami otrzymującymi nil'ed – stevesliva

+0

Również 'awakeFromInsert' nie jest wywoływany! – stevesliva

+0

'' 'awakeFromInsert''' zostanie wywołany, jeśli później dodasz go do MOC za pomocą' '' [moc insertObject: model]; '' ' – etipton

Powiązane problemy