AFNetworking 2.0 跟踪文件上传进度

ios

1个回答

写回答

delicatebirdak_

2025-06-22 11:10

+ 关注

IOS
IOS

在进行文件上传的过程中,了解文件上传的进度是非常重要的。AFNetworking是一个强大的IOS网络请求库,它提供了一种简单的方法来跟踪文件上传的进度。在本文中,我们将介绍如何使用AFNetworking 2.0来实现文件上传的进度跟踪,并提供一个案例代码来演示这个过程。

使用AFURLSessionManager进行文件上传

AFNetworking 2.0引入了一个新的类AFURLSessionManager,它是对NSURLSession的封装。我们可以使用它来进行文件上传,并跟踪上传进度。首先,我们需要创建一个AFURLSessionManager实例,并设置上传进度的回调方法。代码如下:

objective-c

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSProgress *progress = nil;

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:fileURL progress:&progress completionHandler:^(NSURLResponse *response, id responSEObject, NSError *error) {

if (error) {

NSLog(@"Error: %@", error);

} else {

NSLog(@"Success: %@ %@", response, responSEObject);

}

}];

[uploadTask resume];

在上面的代码中,我们创建了一个AFURLSessionManager实例,并使用uploadTaskWithRequest:fromFile:progress:completionHandler:方法创建了一个上传任务。我们通过传递一个NSProgress对象的指针来获得上传进度的更新。在上传完成后,我们可以在completionHandler中处理上传结果。

跟踪上传进度

要跟踪上传进度,我们可以使用NSProgress对象的KVO(Key-Value Observing)机制。我们可以观察NSProgress对象的fractionCompleted属性的变化来获取上传进度的更新。代码如下:

objective-c

[progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

if ([keyPath isEqualToString:@"fractionCompleted"]) {

NSProgress *progress = (NSProgress *)object;

NSLog(@"Upload Progress: %f", progress.fractionCompleted);

}

}

在上面的代码中,我们使用addObserver:forKeyPath:options:context:方法来观察fractionCompleted属性。在observeValueForKeyPath:ofObject:change:context:方法中,我们可以处理上传进度的更新。这样,每当上传进度发生变化时,我们都会收到通知。

案例代码

下面是一个简单的示例代码,演示了如何使用AFNetworking 2.0来跟踪文件上传的进度:

objective-c

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSString *filePath = [[NSBundle mAInBundle] pathForResource:@"example" ofType:@"txt"];

NSURL *fileURL = [NSURL fileURLWithPath:filePath];

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://www.example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

[formData appendPartWithFileURL:fileURL name:@"file" fileName:@"example.txt" mimeType:@"text/plAIn" error:nil];

} error:nil];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSProgress *progress = nil;

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:fileURL progress:&progress completionHandler:^(NSURLResponse *response, id responSEObject, NSError *error) {

if (error) {

NSLog(@"Error: %@", error);

} else {

NSLog(@"Success: %@ %@", response, responSEObject);

}

}];

[progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];

[uploadTask resume];

在上面的代码中,我们首先创建了一个上传任务的请求。然后,我们创建了一个AFURLSessionManager实例,并通过uploadTaskWithRequest:fromFile:progress:completionHandler:方法创建了一个上传任务。最后,我们使用KVO机制观察NSProgress对象的fractionCompleted属性,并在observeValueForKeyPath:ofObject:change:context:方法中处理上传进度的更新。

通过以上的代码,我们可以很方便地使用AFNetworking 2.0来跟踪文件上传的进度。这样,我们就可以实时获取上传进度的更新,以便在用户界面上显示进度条或提供其他相关信息。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号