Pro Core Data book, пример кода вопроса - PullRequest
0 голосов
/ 11 августа 2011

Я изучаю основные данные с помощью книги. Есть код:

- (void)loadData {
// Pull the movies. If we have 200, assume our db is set up.
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Movie"
                               inManagedObjectContext:context]];
NSArray *results = [context executeFetchRequest:request error:nil];
if ([results count] != 200) {
// Add 200 actors, movies, and studios
for (int i = 1; i <= 200; i++) {
[self insertObjectForName:@"Actor" withName:
                 [NSString stringWithFormat: @"Actor %d", i]];
[self insertObjectForName:@"Movie" withName:
                 [NSString stringWithFormat: @"Movie %d", i]];
[self insertObjectForName:@"Studio" withName:
                 [NSString stringWithFormat: @"Studio %d", i]];
}
// Relate all the actors and all the studios to all the movies
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Movie"
                               inManagedObjectContext:context]];
NSArray *results = [context executeFetchRequest:request error:nil];
for (NSManagedObject *movie in results) {
[request setEntity:[NSEntityDescription entityForName:@"Actor"
                               inManagedObjectContext:context]];
NSArray *actors = [context executeFetchRequest:request error:nil];
NSMutableSet *set = [movie mutableSetValueForKey:@"actors"];
[set addObjectsFromArray:actors];
[request setEntity:[NSEntityDescription entityForName:@"Studio"
                               inManagedObjectContext:context]];
NSArray *studios = [context executeFetchRequest:request error:nil];
set = [movie mutableSetValueForKey:@"studios"];
[set addObjectsFromArray:studios];
}
}
[request release];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}

Основной вопрос: нужно ли обновлять указатель контекста, если в этом контексте произошли какие-либо изменения? Что я имею в виду: я получаю указатель на контекст в начале метода, затем в цикле я беру этот контекст и вставляю туда управляемые объекты (-insertObjectForName: withName :). Затем я вижу это обновление указателя контекста и задаю вопрос: это какое-то правило, и я должен действовать так же, или это просто не очень аккуратный пример кода? Почему я не могу использовать старый указатель?

--- Edit --- Еще один вопрос: это легальная инициализация запроса здесь в коде:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
...
NSFetchRequest *request = [[NSFetchRequest alloc] init];
...
[request release];

Два распределения и только один выпуск?

Ответы [ 3 ]

0 голосов
/ 11 августа 2011

У меня тоже есть эта книга, и я посмотрел ее.

Мне кажется, что это опечатка, и в этом нет особого смысла.

Просто проигнорируйте эту строку и продолжайте - она ​​должна нормально работать без.

0 голосов
/ 11 августа 2011

Это какой-то серьезно уродливый код.

Это:

NSManagedObjectContext * context = [selfagedObjectContext];

... возможно потому, что они хотят иметь возможность писать context в вызове метода вместо self.managedObjectContext.

Использование: NSFetchRequest * request = [[NSFetchRequest alloc] init];

... разрешено дважды, но это ленивая плохая практика. Любая переменная должна быть названа только один раз в области видимости. Фактически, компилятор сгенерирует предупреждение с этим кодом. Это будет течь, потому что каждый init должен быть сбалансирован release.

0 голосов
/ 11 августа 2011

На мой взгляд

это просто не очень аккуратный пример кода

О вашем втором вопросе: Должны быть и два выпуска!В противном случае у вас есть утечка.

...