批量上传、下载及图片多选


1
2
3
4
5
#网络请求
pod 'AFNetworking', '~> 3.0'
#相册多选
pod 'TZImagePickerController'

1.图片多选

用的第三方库如上,觉得挺不错的图片多选组件,UIImage,Assets均有返回(pod search 可找到更多相关的ImagePicker)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma mark -- imagePicker
- (void)getImagePicker{
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:9 delegate:self];
[self presentViewController:imagePickerVc animated:YES completion:nil];
}
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray<UIImage *> *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto{
if (self.imgArr.count != 0) {
[self.imgArr removeAllObjects];
}
[self.imgArr addObjectsFromArray:photos];
[self showImgInScrollView];
[self uploadImg];
}

2.上传下载

AFNetworking3.0的基本上传下载,方法均封装在NetworkTool中
(1)上传
用GCD的方式批量上传:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma mark -- 上传
- (void)uploadImg{
//GCD方式
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i<self.imgArr.count; i++) {
dispatch_group_enter(group);
NSURLSessionUploadTask *uploadTask = [NetworkTool uploadImgWithImg:self.imgArr[i] completion:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"第%d张图片上传失败",i+1);
dispatch_group_leave(group);
}
else{
// NSLog(@"%@",responseObject);
NSDictionary *dic = responseObject;
if ([dic[@"flag"] isEqualToString:@"SUCCESS"]) {
NSLog(@"第%d张图片上传成功",i+1);
}
dispatch_group_leave(group);
}
} progress:^(NSProgress *uploadProgress, long long total, long long complet) {
NSLog(@"%.f%%",(float)complet/total * 100);
}];
[uploadTask resume];
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"上传完成!");
});
}

(2)下载
为了实现断点续传,返回一个NSURLSessionDownloadTask便于操作,根据状态判断继续或者暂停

3.网络监听

放到AppDelegate中

1
[NetworkTool AFNReachability];

实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
+ (void)AFNReachability
{
//1.创建网络监听管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//2.监听网络状态的改变
/*
AFNetworkReachabilityStatusUnknown = 未知
AFNetworkReachabilityStatusNotReachable = 没有网络
AFNetworkReachabilityStatusReachableViaWWAN = 3G
AFNetworkReachabilityStatusReachableViaWiFi = WIFI
*/
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI");
break;
default:
break;
}
}];
//3.开始监听
[manager startMonitoring];
}

4.遇到的坑

下载方法中,return的NSURL,如是本地文件路径,要用fileURLWithPath方法

1
2
3
4
5
6
7
8
9
destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//下载地址
// WKNSLog(@"默认下载地址:%@",targetPath);
//设置下载路径,通过沙盒获取缓存地址,最后返回NSURL对象
// NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
return [NSURL fileURLWithPath:filePath];
}

Demo地址:https://github.com/m1penny/AFTest/
Swift版本:https://github.com/m1penny/NetworkTestSwift/