Tag: 414

  • How to wait until several AFNetworking requests finish

    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;
    }