- 下载操作(使用KV0监听进度)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 获得网络管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 要下载文件的url
NSURL *url = [NSURL URLWithString:@"http://localhost/abc.mp4"];
// 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 声明一个进度对象
NSProgress *progress = nil;
// 异步
[[manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
// 告诉服务器下载的文本保存的位置在那里
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
NSLog(@"file = %@",targetPath);
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"response = %@,filePath = %@",response,filePath);
}] resume];
// 使用 KVO 监听进度
[progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];
}
- (void)dealloc {
// 移除kvo监听
[self removeObserver:self forKeyPath:@"name"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
if([object isKindOfClass:[NSProgress class]]) {
// 获得进度值
NSProgress *progress = (NSProgress *)object;
NSLog(@"下载进度----%f",progress.fractionCompleted);
NSLog(@"localizedDescription = %@",progress.localizedDescription);
NSLog(@"localizedAdditionalDescription = %@",progress.localizedAdditionalDescription);
}
}
- 上传操作(单个文件)
/**
* 上传单个文件
*/
* (void)uploadFile {
// 获得网络管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:@"http://localhost/post/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 获得要上传文件的二进制数据
NSData *fileData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"001.png" ofType:nil]];
/**
参数1:文件的二进制数据
参数2:对应服务器接收文件数据的字段
参数3:保存的文件名
参数4:告诉服务器上传的文件类型
*/
[formData appendPartWithFileData:fileData name:@"userfile" fileName:@"oooo.png" mimeType:@"image/png"];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"responseObject = %@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
}
- 上传多个文件
/**
* 上传多个文件
*/
- (void)uploadFile2 {
// 获得网络管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 普通参数
NSDictionary *params = @{@"username":@"rose"};
[manager POST:@"http://localhost/post/upload-m.php" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 获得要上传文件的二进制数据
NSData *fileData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"001.png" ofType:nil]];
/**
参数1:文件的二进制数据
参数2:对应服务器接收文件数据的字段
参数3:保存的文件名
参数4:告诉服务器上传的文件类型
*/
[formData appendPartWithFileData:fileData name:@"userfile[]" fileName:@"oooo.png" mimeType:@"image/png"];
// 第二个文件
// 文件url
NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"head4.png" withExtension:nil];
[formData appendPartWithFileURL:fileUrl name:@"userfile[]" fileName:@"111.png" mimeType:@"image/png" error:NULL];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"responseObject = %@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
}
完成操作
注意
这里的KVO不需要我们自己手动释放。若像以前我们自己创建的KVO 一定要记得释放。