Как показать индикатор выполнения с 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);
// });
// }
}];
Кто-нибудь, пожалуйста, помогите мне! Спасибо!
1 ответ
Решение
Попробуй этот код
- (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);
}
}];
}
Код для отслеживания загрузки и загрузки
-(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) {
...
}];
}