У вас есть неправильный способ использования serverSet и localSet в объединении - изменяемый набор является получателем метода "unionSet:", а не аргументом.
NSMutableSet* localSet = [[NSMutableSet alloc] initWithArray:symbols];
NSMutableArray* fetchedSymbolsArray = [NSMutableArray array];
for (NSDictionary* symbol in fetchedSymbols) {
[fetchedSymbolsArray addObject:[NSDictionary dictionaryWithObject:[symbol valueForKey:@"symbol"] forKey:@"symbol"]];
}
NSMutableSet* serverSet = [[NSMutableSet alloc] initWithArray:fetchedSymbolsArray];
[localSet unionSet:serverSet];
for (NSDictionary* symbol in localSet) {
NSLog(@"%@",[symbol valueForKey:@"symbol"]);
}
Обратите внимание, что наборы по определению не допускают дублирования записей. Но это не означает, что у вас не будет дубликатов значений в словаре, это означает, что у вас не будет одинакового «равного» словаря дважды (два словаря равны, если каждый из них содержит одинаковое количество записей и, для данного ключа соответствующие объекты значений в каждом словаре удовлетворяют isEqual: test).
Чтобы избежать дубликатов определенного значения словаря, вам необходимо добавить их самостоятельно. Я бы порекомендовал вам создать временный набор, который содержит фактические значения для клавиши «символ», и использовать этот набор, чтобы проверить, был ли он уже добавлен.
NSMutableSet *localSetValues = [[NSMutableSet alloc] init];
// Add local set values
for (NSDictionary *symbol in localSet) {
[localSetValues addObject:[symbol valueForKey:@"symbol"]];
}
// Add server set, conditionally
for (NSDictionary *symbol in serverSet) {
if (![localSetValues containsObject:[symbol valueForKey:@"symbol"]]) {
[localSet addObject:symbol];
}
}
// Cleanup
[localSetValues release];
Вместо
[localSet unionSet:serverSet];