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

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

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

将图片和对应的 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 ; idx.count; idx++) {

                id file = [array objectAtIndex:idx];

                [weakSelf asyncUploadFile:file uploadIndex:idx qnToken:qnToken fileKey:key complete:^(NSDictionary *dictionary, NSError *error) {

                    if (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 将图片名称排序放到一个数组里

//核心部分代码

具体使用例子

本文只提供了七牛云多图上传过程中如何处理图片顺序的一个思路,如果正好有这方面需求的同行 可以加我 QQ 1060545231

你可能感兴趣的:(iOS,开发,app,苹果)