Я вижу два способа сделать это. Мне кажется, что последний (предложенный вами метод) является лучшим решением.
Я изменил id на primaryKey, так как не думаю, что было бы неплохо использовать id в качестве имени переменной или метода в Object-C, поскольку это ключевое слово. Я мог бы работать, я никогда не пробовал. Также я предположил, что primaryKey - это NSNumber, поскольку именно так будет храниться в Базовых данных.
Метод Один будет каждый раз выполнять запрос выборки в контексте:
for (id data in someSetOfDataToImport) {
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Story" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"primaryKey = %d", primaryKey]];
NSUInteger count = [context countForFetchRequest:request error:nil];
[request release];
if (count > 0)
continue;
// Insert data in Managed Object Context
}
Метод Два делает то, что вы предложили, кешировать ключи в массиве и проверять его вместо перехода к источнику:
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Story" inManagedObjectContext:context]];
NSArray * allStories = [context countForFetchRequest:request error:nil];
[request release];
NSMutableArray * allPrimaryKeys = [[allStories valueForKeyPath:@"@distinctUnionOfObjects.primaryKey"] mutableCopy];
for (id data in someSetOfDataToImport) {
if ([allPrimaryKeys containsObject:data.primaryKey])
continue;
[allPrimaryKeys addObject:data.primaryKey];
// Insert data in Managed Object Context
}
[allPrimaryKeys release];