Как использовать dispatch_apply для замены вложенного цикла GCD для получения максимальной производительности одновременно
У меня есть вложенный цикл. Я хочу оптимизировать его с помощью GCD-параллелизма. Пытался:
- Замените оба цикла на gcd_apply.
- Заменен только внутренний цикл for на gcd_apply.
Я хочу получить окончательный вариант, поставить без изменений в порядке.
-(NSMutableArray*)getsportNotificationObjectsByGroup{
NSMutableArray* notificationObjects = [NSMutableArray array];
NSString* defaultNoteValue;
defaultNoteValue = [WADeviceAndAppSettingPopUpManager getDefaultNoteValueBasedOnSystemAlertButtonAction];
for(WACategoryInfo * categoryInfo in self.allSportSCategories){
@autoreleasepool {
NSMutableArray *subArray = [[NSMutableArray alloc] init];;
for (NSDictionary *dictNotificationTags in categoryInfo.notificationTags) {
NSString *tagName, *tagCode;
BOOL isTagDefaultEnabled = NO;
tagName = [dictNotificationTags objectForKeyWithNullCheck:ktagName];
tagCode = [dictNotificationTags objectForKeyWithNullCheck:ktagCode];
isTagDefaultEnabled = [[dictNotificationTags objectForKeyWithNullCheck:kisTagDefaultEnabled] boolValue];
//********value computation*******//
NSString* val = @"";
if ([WAConfigLoader sharedInstance].isCollegeStyleApp) {
val = [WADeviceAndAppSettingPopUpManager getValueForSwitch:dictNotificationTags];
}
//*****value computation*********//
NSDictionary *sportDetail = @{
kname:tagName,
ktype:kswitch,
kid:tagCode,
kvalue : val,
ksportStringId:categoryInfo.sportStringID,
kTitleKey : tagName
};
[subArray addObject:sportDetail];
}
NSMutableDictionary *aNewDict = [[NSMutableDictionary alloc] init];
[aNewDict setObject:subArray forKey:kdata];
[aNewDict setObject:categoryInfo.sportTitle forKey:ksection];
[notificationObjects addObject:aNewDict];
}
}
return notificationObjects;
}
Не обязательно использовать только GCD, моя задача - максимизировать производительность цикла.
1 ответ
Если вы замените внутренний цикл dispatch_apply
Вы должны принять во внимание эти недостатки:
- Вы должны синхронизировать вызов
[subArray addObject]
- Заказ в
subArray
неопределен
Поэтому я бы рекомендовал поместить только внешний цикл в dispatch_apply
рабочий элемент, потому что его результаты добавляются в словарь, который не обеспечивает какой-либо порядок. Тем не менее, вам придется синхронизировать [notificationObjects addObject]
тем не мение.
Просто не забудьте отправить dispatch_apply в параллельную очередь.