Перебор AFHTTPSessionManager в фоновом режиме - PullRequest
0 голосов
/ 21 ноября 2018

Я использую AFHTTPSessionManager для получения информации из API несколько раз.Он работает правильно, когда не в фоновом режиме, хотя после закрытия приложения вызов AFHTTPSessionManager, похоже, не хочет работать, он блокируется.

-(void)requestGET:(NSString *)strURL xml:(BOOL)xml Token:(NSString *)token success:(void (^)(NSDictionary *responseObject))success failure:(void (^)(NSError *error))failure {

    BOOL isNetworkAvailable = [self checkNetConnection];

    if (!isNetworkAvailable) {
        NSLog(@"No connection");
        [self showAlert:@"Please check your internet connection"];
        return;
    }else{

        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        [manager.requestSerializer setValue:[NSString stringWithFormat:@"Bearer %@",token] forHTTPHeaderField:@"Authorization"];

        if(xml){
            // Content xml
            manager.responseSerializer = [AFHTTPResponseSerializer new];
            manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/vnd.garmin.tcx+xml", nil];
        }else{
            // Content json
            manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", nil];
        }

        [manager GET:strURL parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            if([responseObject isKindOfClass:[NSDictionary class]]) {
                // Return json
                if(success) {
                    success(responseObject);
                }
            }else{
                // Return xml to nsdictionary
                if(success){
                    NSString* responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
                    NSDictionary * XMLDictionary = [XMLReader dictionaryForXMLString:responseStr error:nil];
                    success(XMLDictionary);
                }
            }
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"%@", error);
            if(failure) {
                failure(error);
            }
        }];
    }
}

Вышеуказанный метод вызывается ниже несколько раз, чтобы захватитьданные из API и выкачать их.

-(void)getFitbitURL{

    // Create group
    dispatch_group_t group = dispatch_group_create();

    // Retrieve array
    NSMutableArray *URLS = [self generateURLS];
    for (NSMutableArray *entity in URLS){

        NSString *url = entity[0];

        // Enter group
        dispatch_group_enter(group);

        NSString *token = [FitbitAuthHandler getToken];
        FitbitAPIManager *manager = [FitbitAPIManager sharedManager];

        // Get URL
        [manager requestGET:url xml:0 Token:token success:^(NSDictionary *responseObject) {

            // Do stuff with output
            printf("%s",[[responseObject description]UTF8String]);

            // Leave group
            dispatch_group_leave(group);

        } failure:^(NSError *error) {
            NSLog("%@",error);

            // Leave group
            dispatch_group_leave(group);
        }];
    }

    // Wait for all of group to complete 
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
      NSLog(@"Complete");
    });
}

Я пытался исследовать в Интернете, как это сделать, но все мои идеи провалились, мой метод applicationDidEnterBackground работает правильно, когда приложение закрывается, но все остальное не работает правильно, например, URLЗапросы.Любые предложения будут оценены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...