How to wait until several AFNetworking requests finish

No comments on How to wait until several AFNetworking requests finish

Written by

in

Use dispatch_group_t, dispatch_group_enter dispatch_group_leave, dispatch_group_notify.

Also, below is code to send a huge array to server by dividing ti to parts. It is actual when a single request is too big for server – you get “URL too long error” or HTTP 414.

- (void)divideAndSendContacts:(NSArray *)contactsArray
{
    [self showSpinner];
    
    dispatch_group_t group = dispatch_group_create();
    
    NSInteger maxContactsInOneRequest = 29;
    NSInteger totalCount = [contactsArray count];
    
    // Округляем в большую сторону по формуле A/B = (A+B-1)/B, например (700 + 300 - 1)/300 = 3.33 = 3.
    NSInteger numberOfParts = (totalCount + maxContactsInOneRequest - 1) / maxContactsInOneRequest;

    for (int i = 0; i < numberOfParts; i++) {
        NSRange range = NSMakeRange(i * maxContactsInOneRequest, maxContactsInOneRequest);
        NSInteger lastItemIndex = i * maxContactsInOneRequest + maxContactsInOneRequest; // Например, i=3, 29*3+29=116. Больше 100, поэтому вместо 29 берем 100-29*3=13
        
        if ( lastItemIndex > totalCount ) {
            NSInteger length = totalCount - i * maxContactsInOneRequest;
            range = NSMakeRange(i * maxContactsInOneRequest, length);
        }
        
        NSArray *contactsArrayPart = [contactsArray subarrayWithRange:range];
        
        NSDictionary *contactsDic = @{@"phone_book" : @{@"contacts" : contactsArrayPart}};
        
        dispatch_group_enter(group);
        
        [[SSHTTPClient sharedClient] POST:@"/api/contacts" parameters:contactsDic progress:^(NSProgress * _Nonnull uploadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            dispatch_group_leave(group);
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            NSLog(@"Failed method: %@", NSStringFromSelector(_cmd));
            dispatch_group_leave(group);
            
        }];
    }
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        
        [self hideSpinner];
        
        [self loadContactsFromServer];
        
    });
    
    return;
}

Comments

Leave a Reply

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