如何使用dispatch_apply替换GCD的嵌套for循环以获得最大的并发性能

时间:2017-02-02 07:32:57

标签: ios objective-c performance for-loop processing-efficiency

我有一个嵌套的for循环。我想使用GCD并发来优化它。尝试:

  1. 将两个for循环替换为gcd_apply。
  2. 仅使用gcd_apply替换内部for循环。
  3. 我希望最终输出相同而不改变顺序。

    -(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 个答案:

答案 0 :(得分:0)

如果用dispatch_apply替换内循环,则必须关注这些缺点:

  • 您必须将通话同步到[subArray addObject]
  • subArray中的订单未确定

因此,我建议只将外部循环放在dispatch_apply工作项中,因为它的结果会添加到不提供任何顺序的字典中。不过,您无论如何都必须同步[notificationObjects addObject]

请记住将dispatch_apply发送到并发队列。