Как использовать dispatch_apply для замены вложенного цикла GCD для получения максимальной производительности одновременно

У меня есть вложенный цикл. Я хочу оптимизировать его с помощью GCD-параллелизма. Пытался:

  1. Замените оба цикла на gcd_apply.
  2. Заменен только внутренний цикл 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 в параллельную очередь.

Другие вопросы по тегам