七牛云多图片上传顺序问题

七牛云只提供了单张图片上传的 API, 如果需要多张图片上传,那么就需要多次调用上传文件的 API, 这样在多图片上传时无法保证上传图片顺序,因为有的图片上传的快,有的图片上传的慢,类似朋友圈发表评论的功能,用户可以选择上传图片,那么你必须保证上传图片的顺序跟用户选择图片的顺序一致.本文提供了部分代码,教你如何使用七牛云多图片上传时图片顺序的问题.

将图片和对应的 key 放到一个字典里,可以同时上传包括avatar 和 showImage 等多个不同意义的图片,同时上传这些图片,然后对上传后数据进行分类和图片名称排序

/**
 *  七牛上传多张图片的接口
 *
 *  @param files               二进制文件集合 @{@"key1" : @[UIImage1,UIImage2],@"key2" :[NSData,NSData]};
 *  @param completionHandler   完成后的回调
 */
- (void) uploadFiles:(NSDictionary *)files
		  imageCount:(NSInteger)count
			complete:(CYQNUpCompletionHandler)completionHandler;

复制代码

/**
 *  七牛上传多张图片的接口
 *
 *  @param files               二进制文件集合 @{@"key1" : @[UIImage1,UIImage2],@"key2" :[NSData,NSData]};
 *  @param completionHandler    完成后的回调
 */
- (void) uploadFiles:(NSDictionary *)files
		  imageCount:(NSInteger)count
			complete:(CYQNUpCompletionHandler)completionHandler {

	__weak typeof(self)weakSelf 		   = self;

	dispatch_async(dispatch_get_global_queue(0, 0), ^{
		
		__block NSInteger uploadImageCount = 1;
		NSMutableArray *keysArray 	       = [NSMutableArray array];
		__block NSString *qnToken		   = [weakSelf getQiniuToken];
		
		[files enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
			
			__weak NSArray *array = (NSArray*)obj;
			
			for (int idx = 0 ; idxif (error) {
						completionHandler(nil,[NSError errorWithDomain:@"图片上传错误,请重新上传" code:201 userInfo:nil]);
						return;
					}
					
					[keysArray addObject:dictionary];
					NSMutableDictionary *result = [NSMutableDictionary dictionary];
					if (uploadImageCount == count) {
						
						for (NSString *key in files.allKeys) {
							//利用 KVC 高级用法 从key sArray 分离出所有 key相关值的字典 并把值放到一个子数组里
							NSArray *subArray = [[keysArray valueForKey:key] mutableCopy];
							///数组值去除NSNull类型的
							subArray 		  = [CYQNUploadManager yv_removeNullWithArray:subArray];
							///对上传的图片进行排序 保证上传图片顺序
							subArray		  = [subArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
								NSString *image1 = obj1;
								NSString *image2 = obj2;
								return [image1 compare:image2];
							}];
							[result setObject:subArray forKey:key];
						}
						
						dispatch_async(dispatch_get_main_queue(), ^{
							if (completionHandler) {
								completionHandler(result,nil);
							}
						});
						
					}
					
					uploadImageCount+=1;
					
				}];
				
			}
			
		}];
		
	});
	
	
}

复制代码

单张图片上传方法,可多次执行上传多张图片时


/**
 异步上传图片的方法
 
 @param file  二进制文件集合 @{@"key1" : @[UIImage1,UIImage2],@"key2" :[NSData,NSData]};
 @param completionHandler 完成后的回调
 */
- (void) asyncUploadFile:(id)file
			uploadIndex:(NSInteger)index
				qnToken:(NSString *)token
				fileKey:(NSString *)aKey
			   complete:(CYQNUpCompletionHandler)completionHandler {
	
	__block NSDictionary *resultDict;
	__weak typeof(self)weakSelf = self;
	NSData *data;
	if ([file isKindOfClass:[UIImage class]]) {
		data = UIImageJPEGRepresentation(file, 0.10f);
	} else if ([data isKindOfClass:[NSData class]]) {
		data = (NSData*)file;
	} else { // 其他类型
		NSAssert(NO, @"file 类型不合法,必须是 UIImage/NSData 类型实例");
	}
	YVQNAssetFile *uploadFile		   = [[YVQNAssetFile alloc] init];
	uploadFile.data                    = data;
	QNUploadOption *option 			   = [[QNUploadOption alloc] initWithMime:nil progressHandler:^(NSString *key, float percent) {
	} params:@{@"x:foo" : aKey} checkCrc:NO cancellationSignal:nil];

	[weakSelf.qnUploadManager putData:uploadFile.data key:[NSString stringWithFormat:@"/%@/%@-index_%zd.png",aKey,uploadFile.fileName,index] token:token complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
		
		CYQNResponseResp *cyQnResp = [[CYQNResponseResp alloc] init];
		cyQnResp.qnKey			   = [resp objectForKey:@"key"];
		cyQnResp.qnHash	          = [resp objectForKey:@"hash"];
		cyQnResp.type			   = [resp objectForKey:@"x:foo"];
		if (!info.error) {
			resultDict =  @{cyQnResp.type:cyQnResp.qnKey};
			completionHandler(resultDict,nil);
		} else {
			completionHandler(nil,info.error);
		}
			
	} option:option];	
	
}

复制代码

图片排序就是在上传时候 给图片名 key 里加入 index 这样的标识,将来上传成功后根据 index 将图片名称排序放到一个数组里

//核心部分代码

具体使用例子

好了,我是大兵布莱恩特,欢迎加入博主技术交流群,iOS 开发交流群

转载于:https://juejin.im/post/5b46e61c6fb9a04fb309eb25

你可能感兴趣的:(七牛云多图片上传顺序问题)