То, что вы делаете, будет очень дорого. Вы должны помнить, что каждый раз, когда вы выполняете NSFetchRequest
, вы собираетесь выполнять SQL (дорого) и делать ввод / вывод (также дорого). Ваша цель - ограничить количество раз, когда вы это делаете.
Если вы можете получить список (скажем, 10) уникальных ключей (в вашем случае imageURL), а затем выполнить запрос на выборку, чтобы посмотреть, какие из этих imageURL уже есть в магазине, это будет намного дешевле ( в данном случае примерно 10).
Кроме того, поскольку вас интересуют не сами объекты, а просто их наличие, вам следует установить для resultType
запроса выборки значение NSDictionaryResultType
и задать для propertiesToFetch
массив, содержащий только ваш ключ, т.е. [NSArray arrayWithObject:@"imageUrl"]
.
Наконец, сравнение строк очень дорого. Старайтесь не использовать @"imageUrl contains[cd] %@"
. Требуется база данных, чтобы сделать много работы. Если у вас есть цифровой ключ, например, 64-разрядное число, которое значительно ускоряет работу, поскольку вы можете использовать числовое сравнение.
Соединив все это, давайте предположим, что ваш атрибут уникальных ключей называется uniqueID
. Вы можете запустить запрос на выборку, как этот
- (NSArray *)keysMissingInStoreFromKeys:(NSArray *)someKeys;
{
NSFetchRequest *r = [NSFetchRequest fetchRequestWithEntityName:@"Image"];
[r setResultType:NSDictionaryResultType];
[r setPropertiesToFetch:[NSArray arrayWithObject:@"uniqueID"];
NSPredicate *p = [NSPredicate predicateWithFormat:@"uniqueID IN %@", someKeys];
[r setPredicate:p];
NSError *error = nil;
NSArray *result = [moc executeFetchRequest:r error:&error];
NSAssert(result != nil, @"Fetch failed: %@", error);
NSMutableArray *missingKeys = [someKeys mutableCopy];
for (NSDictionary *values in result) {
id uniqueID = [values objectForKey:@"uniqueID"];
[missingKeys removeObject:uniqueID];
}
return missingKeys;
}
Надеюсь, это поможет.