Using dispatch group to wait until multiple operations executed – including completion block (AFNetworking)

No comments on Using dispatch group to wait until multiple operations executed – including completion block (AFNetworking)

Written by

in

// Загрузка дополнительных данных с сервера по API для форм
- (void)loadAdditionalInformationFromServer
{
    loadingError = nil;
    success = YES;
    
    group = dispatch_group_create();
    
    [self startOfferEducationsRetrieveOperation];
    
    [self startOfferLanguageLevelsRetrieveOperation];
    
    [self startOfferTradesRetrieveOperation];
    
    [self startOfferLanguagesRetrieveOperation];
    
    [self startOperatingScheduleRetrieveOperation];
    
    [self startRegionsRetrieveOperation];
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
     [self.delegate resumeManagerDidFinishLoadingAdditionalInformationWithSuccess:success error:loadingError];
    });
    
    //dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    dispatch_release(group);
}


// Запрос на получение уровней образования
- (void)startOfferEducationsRetrieveOperation
{
    if ([[RRSession sharedSession] offerEducations] == nil) {
        
        // Блок успешного завершения запроса
        SuccessBlock successBlock = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            
            NSArray *jsonArray = (NSArray *)JSON;
            NSMutableArray *temp = [NSMutableArray new];
            for (NSDictionary *jsonDic in jsonArray) {
                RROfferEducation *obj = [[RROfferEducation alloc] initFromDic:jsonDic];
                [temp addObject:obj];
            }
            [[RRSession sharedSession] setOfferEducations:temp];
            
            dispatch_group_leave(group);
        };
        
        // Добавление запроса на загрузку в очередь
        [self addOperationForMethod:RRApiMethodOfferEducations successBlock:successBlock];
    }
}


// Запрос на получение уровней владения языком
- (void)startOfferLanguageLevelsRetrieveOperation
{
    if ([[RRSession sharedSession] offerLanguageLevels] == nil) {
        // Блок успешного завершения запроса
        SuccessBlock successBlock = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            
            NSArray *jsonArray = (NSArray *)JSON;
            NSMutableArray *temp = [NSMutableArray new];
            for (NSDictionary *jsonDic in jsonArray) {
                RROfferLanguageLevel *obj = [[RROfferLanguageLevel alloc] initFromDic:jsonDic];
                [temp addObject:obj];
            }
            [[RRSession sharedSession] setOfferLanguageLevels:temp];
            
            dispatch_group_leave(group);
        };
        
        // Добавление запроса на загрузку в очередь
        [self addOperationForMethod:RRApiMethodOfferLanguageLevels successBlock:successBlock];
    }
}


// Запрос на получение языков
- (void)startOfferLanguagesRetrieveOperation
{
    if ([[RRSession sharedSession] offerLanguages] == nil) {
        // Блок успешного завершения запроса
        SuccessBlock successBlock = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            
            NSArray *jsonArray = (NSArray *)JSON;
            NSMutableArray *temp = [NSMutableArray new];
            for (NSDictionary *jsonDic in jsonArray) {
                RROfferLanguage *obj = [[RROfferLanguage alloc] initFromDic:jsonDic];
                [temp addObject:obj];
            }
            [[RRSession sharedSession] setOfferLanguages:temp];
            
            dispatch_group_leave(group);
        };
        
        // Добавление запроса на загрузку в очередь
        [self addOperationForMethod:RRApiMethodOfferLanguages successBlock:successBlock];
    }
}


// Запрос на получение графиков работы
- (void)startOperatingScheduleRetrieveOperation
{
    if ([[RRSession sharedSession] operatingSchedules] == nil) {
        // Блок успешного завершения запроса
        SuccessBlock successBlock = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            
            NSArray *jsonArray = (NSArray *)JSON;
            NSMutableArray *temp = [NSMutableArray new];
            for (NSDictionary *jsonDic in jsonArray) {
                RROperatingSchedule *obj = [[RROperatingSchedule alloc] initFromDic:jsonDic];
                [temp addObject:obj];
            }
            [[RRSession sharedSession] setOperatingSchedules:temp];
            
            dispatch_group_leave(group);
        };
        
        // Добавление запроса на загрузку в очередь
        [self addOperationForMethod:RRApiMethodOperatingSchedules successBlock:successBlock];
    }
}


// Запрос на получение регионов
- (void)startRegionsRetrieveOperation
{
    if ([[RRSession sharedSession] regions] == nil) {
        // Блок успешного завершения запроса
        SuccessBlock successBlock = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            
            NSArray *jsonArray = (NSArray *)JSON;
            NSMutableArray *temp = [NSMutableArray new];
            for (NSDictionary *jsonDic in jsonArray) {
                RRRegion *obj = [[RRRegion alloc] initFromDic:jsonDic];
                [temp addObject:obj];
            }
            [[RRSession sharedSession] setRegions:temp];
            
            dispatch_group_leave(group);
        };
        
        // Добавление запроса на загрузку в очередь
        [self addOperationForMethod:RRApiMethodRegions successBlock:successBlock];
    }
}


// Запрос на получение рубрик вакансий
- (void)startOfferTradesRetrieveOperation
{
    if ([[RRSession sharedSession] offerTrades] == nil) {
        // Блок успешного завершения запроса
        SuccessBlock successBlock = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            
            NSArray *jsonArray = (NSArray *)JSON;
            NSMutableArray *temp = [NSMutableArray new];
            for (NSDictionary *jsonDic in jsonArray) {
                RROfferTrade *obj = [[RROfferTrade alloc] initFromDic:jsonDic];
                [temp addObject:obj];
            }
            [[RRSession sharedSession] setOfferTrades:temp];
            
            dispatch_group_leave(group);
        };
        
        // Добавление запроса на загрузку в очередь
        [self addOperationForMethod:RRApiMethodOfferTrades successBlock:successBlock];
    }
}


// Добавление запроса на загрузку в очередь
- (void)addOperationForMethod:(NSString *)methodName successBlock:(SuccessBlock)successBlock
{
    dispatch_group_enter(group);
    
    RRHTTPClient *client = [RRHTTPClient sharedClient];
    NSString *apiMethodPath = [NSString stringWithFormat:@"%@%@", [RRHelper apiDomain], methodName];
    NSMutableURLRequest *request = [client requestWithMethod:@"GET" path:apiMethodPath parameters:nil];
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:successBlock failure:[self getStandartFailureBlock]];
    [operation start];
    
    //[[RRServerConnection sharedConnection] addCustomOperation:operation];
}


// Блок обработки ошибки при запросе
- (FailureBlock)getStandartFailureBlock
{
    FailureBlock failureBlock = ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        
        success = NO;
        loadingError = error;
        
        NSLog(@"Error: %@", error);
        [RRHelper showServerErrorMessage];
        
        dispatch_group_leave(group);
        
    };
    
    return failureBlock;
}

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *