Как показать индикатор выполнения с afnetworking 3.0 в ios?

Я хочу загрузить ожидающие данные на сервер, а затем загрузить все данные из базы данных сервера одним нажатием кнопки. Но я не понимаю, как показать индикатор выполнения, показывающий ход загрузки/загрузки. Я пытался использовать «setDownloadTaskDidWriteDataBlock», но он никогда не вызывается. Мой код:

 -(void)asyncTask:(NSString *)strURL parameters:(NSDictionary *)dictParams success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure {


NSLog(@"parameters passed to server through services=%@",dictParams);

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];


[manager POST:strURL parameters:dictParams progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    NSLog(@"inside requestPostUrl JSON: %@", responseObject);

    if([responseObject isKindOfClass:[NSDictionary class]]) {
        if(success) {
            success(responseObject);
        }
    }
    else {
        NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
        if(success) {
            success(response);
        }
    }

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    if(failure) {
        failure(error);
    }

}];

//приведенный ниже метод никогда не запускается

[manager setDownloadTaskDidWriteDataBlock:^(NSURLSession *session,NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {

    CGFloat written = totalBytesWritten;
    CGFloat total = totalBytesExpectedToWrite;
    CGFloat percentageCompleted = written/total;

    NSLog(@"percentage completed=%f",percentageCompleted);


    dispatch_async(dispatch_get_main_queue(), ^{
        // here is what you want


        // vc.progressBarView.progress = (CGFloat)totalBytesWritten / totalBytesExpectedToWrite;
    });

    //Return the completed progress so we can display it somewhere else in app
    //  if( progressBlock){
    //      dispatch_async(dispatch_get_main_queue(), ^{
    //         progressBlock(percentageCompleted,remoteURLPath);
    //     });

    //  }
}];

Кто-нибудь, пожалуйста, помогите мне! Спасибо!


person Deepmala singh M    schedule 24.01.2017    source источник
comment
progress:nil изменить это на progress:self   -  person Matloob Hasnain    schedule 24.01.2017
comment
@matloobHasnain, спасибо за быстрый ответ. прогресс: self выдает ошибку, отправляя «ViewController» * const _strong в параметр несовместимого типа «void (^ _Nullable) (NSProgress * _Nonnull _strong)»   -  person Deepmala singh M    schedule 24.01.2017


Ответы (2)


попробуйте этот код

 - (void)sycLocations:(NSString *)strURL parameters:(NSDictionary *)dictParams success:(void (^)(NSDictionary *responce))success failure:(void (^)(NSError *error))failure {

   __weak typeof(self) vc = self;

    NSLog(@"parameters passed to server through services=%@",dictParams);

    manager = [AFHTTPSessionManager manager];
    // [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];

    [manager POST:strURL parameters:dictParams progress:^(NSProgress * _Nonnull uploadProgress){

        [manager setDataTaskDidReceiveDataBlock:^(NSURLSession *session,
                                                  NSURLSessionDataTask *dataTask,
                                                  NSData *data)
         {
             if (dataTask.countOfBytesExpectedToReceive == NSURLSessionTransferSizeUnknown)
                 return;
             NSUInteger code = [(NSHTTPURLResponse *)dataTask.response statusCode];

             NSLog(@"status from server=%lu",(unsigned long)code);

             if (!(code> 199 && code < 400))
                 return;

             long long  bytesReceived = [dataTask countOfBytesReceived];
             long long  bytesTotal = [dataTask countOfBytesExpectedToReceive];

             dispatch_async(dispatch_get_main_queue(), ^{
                 NSLog(@"show progress status :) ................");
                 vc.progressBar.progress= (CGFloat)bytesReceived / bytesTotal;

             });

         }];
    }success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        if([responseObject isKindOfClass:[NSDictionary class]]) {
            if(success) {
                success(responseObject);
            }
        }
        else {
            NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
            if(success) {
                success(response);
            }
        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if(failure) {
            failure(error);
        }

    }];

}
person sarita    schedule 02.02.2017

Код для отслеживания процесса загрузки и скачивания

-(void)postUpdateV4:(NSString *)param param1:(NSString *)param1 param2:(NSString *)param2 param3:(NSString *)param3 param4:(NSString *)param4 param5:(NSString *)param5 param6:(NSString *)param6 param7:(NSString *)param7 param8:(NSString *)param8 param9:(NSString *)param9
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager.responseSerializer setAcceptableContentTypes:[NSSet setWithArray:@[@"application/json"]]];
 [manager setDataTaskDidReceiveDataBlock:^(NSURLSession *session,
                                              NSURLSessionDataTask *dataTask,
                                              NSData *data)
     {
         if (dataTask.countOfBytesExpectedToReceive == NSURLSessionTransferSizeUnknown)
             return;
         NSUInteger code = [(NSHTTPURLResponse *)dataTask.response statusCode];

         NSLog(@"status from server=%lu",(unsigned long)code);

         if (!(code> 199 && code < 400))
             return;

         long long  bytesReceived = [dataTask countOfBytesReceived];
         long long  bytesTotal = [dataTask countOfBytesExpectedToReceive];
            ...
         });

     }];
[manager setTaskDidSendBodyDataBlock:^(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend)
 {
         double percentDone = (double)totalBytesSent / totalBytesExpectedToSend;
         NSString *percentDoneString = [NSString stringWithFormat:@"%.2f", percentDone];

         ...
 }];

[manager POST:param parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    
    [formData appendPartWithFileData:[param1 dataUsingEncoding:NSUTF8StringEncoding] name:@"payload" fileName:@"temp.txt" mimeType:@"text/plain"]; // you file to upload

    [formData appendPartWithFormData:[param2 dataUsingEncoding:NSUTF8StringEncoding]
                                name:@"title"];
    [formData appendPartWithFormData:[param3 dataUsingEncoding:NSUTF8StringEncoding]
                                name:@"dateSent"];
    [formData appendPartWithFormData:[param4 dataUsingEncoding:NSUTF8StringEncoding]
                                        name:@"language"];
    [formData appendPartWithFormData:[param5 dataUsingEncoding:NSUTF8StringEncoding]
                                        name:@"changesEmailString"];
    [formData appendPartWithFormData:[param6 dataUsingEncoding:NSUTF8StringEncoding]
                                        name:@"sentBy"];
    [formData appendPartWithFormData:[param7 dataUsingEncoding:NSUTF8StringEncoding]
                                        name:@"notifTitle"];
    [formData appendPartWithFormData:[param8 dataUsingEncoding:NSUTF8StringEncoding]
                                        name:@"notifBody"];
    [formData appendPartWithFormData:[param9 dataUsingEncoding:NSUTF8StringEncoding]
                                        name:@"groupToken"];
    
} progress:^(NSProgress * _Nonnull uploadProgress){

       } success:^(NSURLSessionDataTask *task, id responseObject) {
            if(!responseObject)
            {
                ...
            }
            else
            {
                NSDictionary *jsonDict = (NSDictionary *) responseObject;
                NSString *res = [NSString stringWithFormat:@"%@", [jsonDict objectForKey:@"result"]];
                ...
            }
} failure:^(NSURLSessionDataTask *task, NSError *error) {
        ...
}];

}

person JAnton    schedule 20.08.2020