iOS开发-连续拍照异步按顺序批量上传图片

一、数据模型

@interface SSTEditTaskSujectFinishedPictureModel:NSObject

/**
 * 图片上传的日期
 */
@property (nonatomic,copy) NSString *uploadDate;

/**
 * 图片关联的科目
 */
@property (nonatomic,copy) NSString *course;

/**
 * 图片关联的学生
 */
@property (nonatomic,copy) NSString *vipId;

@property (nonatomic,copy) NSString *studentName;

/**
 * 图片id
 */
@property (nonatomic,copy) NSString *homeworkPictureId;

/**
 * 图片id 对比前后端的数据是否重复问题
 */
@property (nonatomic,copy) NSString *derverFileId;

@property (nonatomic,copy) NSString *timestampStr;

/**
 * 图片路径
 */
@property (nonatomic,copy) NSString *image;

@property (nonatomic,copy) NSString *originImageUrl;

@property (nonatomic,copy) NSString *originPictureUrl;

/**
 * 图片批注状态,0默认,1批注, 2补拍,3不全, 4模糊,5上传中(本地管理) ,6上传失败(本地管理) ,7未上传(本地管理)
 */
@property (nonatomic,assign) SSTHomeworkPictureState correctStatus;

/**
 * 图片的本地路径
*/
@property (nonatomic,copy) NSString *localPath;

/**
 * 本地上传的图片
*/
@property (nonatomic,strong) UIImage *localImage;

/**
 * 是否是本地 0:服务器 1:本地
 */
@property (nonatomic,assign)BOOL isLocalData;

/**
 * 序号
 */
@property (nonatomic,assign)int index;

/**
 * 推荐题目记录Id
 */
@property (nonatomic,copy) NSString *questionRecommendRecordId;

@end

二、本地数据管理

#import "DataBaseHelper.h"
#import "SSTEditTaskModel.h"
#define kHOMEWORKImage_TABLE_NAME @"HomeworkImageTable"

NS_ASSUME_NONNULL_BEGIN

@interface DataBaseHelper (ImageUpload)

/**
 *创建作业图片信息表
 */
-(void)creatHomeworkImageInfoTable;

/**
 *保存作业图片信息
 */
-(BOOL)saveHomeworkImageInfo:(SSTEditTaskSujectFinishedPictureModel *)imageModel;

/**
 * 获取所有的作业图片信息
 */
-(NSArray <SSTEditTaskSujectFinishedPictureModel *>*)getAllHomeworkImageModel;

/**
 * 删除作业图片信息
 */
-(BOOL)deleteHomeworkImageModel:(SSTEditTaskSujectFinishedPictureModel *)imageModel;

-(BOOL)deleteHomeworkImageModelBeforeDate:(NSString *)date;

-(BOOL)updateImageModel:(SSTEditTaskSujectFinishedPictureModel *)imageModel withImageModelKey:(NSString *)key andImageModelValue:(NSString *)value;

@end

NS_ASSUME_NONNULL_END

#import "DataBaseHelper+ImageUpload.h"

@implementation DataBaseHelper (ImageUpload)

-(NSArray *)obtainTaskImageInfoTableField {
    NSArray *array = @[@"uploadDate",@"vipId",@"studentName",@"course",@"derverFileId",@"localPath",@"correctStatus",@"timestampStr"];
    return array;
}

/**
 * 创建作业图片的表
 */
-(void)creatHomeworkImageInfoTable{
    [[DataBaseHelper sharedInstance] DatabaseWithDBName:kHOMEWORKImage_TABLE_NAME];
    NSDictionary *dict = @{@"uploadDate":@(DBdatatypeNSString),
                           @"vipId":@(DBdatatypeNSString),
                           @"studentName":@(DBdatatypeNSString),
                           @"course":@(DBdatatypeNSString),
                           @"derverFileId":@(DBdatatypeNSString),
                           @"localPath":@(DBdatatypeNSString),
                           @"timestampStr":@(DBdatatypeNSString),
                           @"correctStatus":@(DBdatatypeInteger)};
    [self createTable:kHOMEWORKImage_TABLE_NAME WithKey:dict];
}

/**
 *保存作业图片信息
 */
-(BOOL)saveHomeworkImageInfo:(SSTEditTaskSujectFinishedPictureModel *)imageModel {
    NSDictionary *dict = @{@"uploadDate":imageModel.uploadDate,
                           @"vipId":imageModel.vipId,
                           @"studentName":imageModel.studentName,
                           @"course":imageModel.course,
                           @"derverFileId":imageModel.derverFileId,
                           @"localPath":imageModel.localPath,
                           @"timestampStr":imageModel.timestampStr,
                           @"correctStatus":@(imageModel.correctStatus)};
    BOOL insert = [self insertInTable:kHOMEWORKImage_TABLE_NAME WithKey:dict];
    SSLog(@"%@-%@图片数据保存%@",imageModel.uploadDate,imageModel.studentName,insert?@"成功":@"失败");
    if (insert) {
        [self saveUploadHomewrokPhoto:imageModel];
    }
    return insert;
}

/**
 * 获取所有的作业图片信息
 */
-(NSArray <SSTEditTaskSujectFinishedPictureModel *>*)getAllHomeworkImageModel {
    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    NSDictionary *keyDict = @{@"uploadDate":@(DBdatatypeNSString),
                           @"vipId":@(DBdatatypeNSString),
                           @"studentName":@(DBdatatypeNSString),
                           @"course":@(DBdatatypeNSString),
                           @"derverFileId":@(DBdatatypeNSString),
                           @"localPath":@(DBdatatypeNSString),
                           @"timestampStr":@(DBdatatypeNSString),
                           @"correctStatus":@(DBdatatypeInteger)};
    tempArray = [self selectInTable:kHOMEWORKImage_TABLE_NAME WithKey:keyDict orderKey:@"timestampStr" orderModel:@"DESC"];
    NSMutableArray *nodeArr = [NSMutableArray array];
    for (NSDictionary *nodeDict in tempArray) {
        SSTEditTaskSujectFinishedPictureModel *voice = [[SSTEditTaskSujectFinishedPictureModel alloc] init];
        voice.vipId = [nodeDict objectForKey:@"vipId"];
        voice.uploadDate = [nodeDict objectForKey:@"uploadDate"];
        voice.studentName = [nodeDict objectForKey:@"studentName"];
        voice.course = [nodeDict objectForKey:@"course"];
        voice.derverFileId = [nodeDict objectForKey:@"derverFileId"];
        voice.localPath = [nodeDict objectForKey:@"localPath"];
        voice.correctStatus = [[nodeDict objectForKey:@"correctStatus"] integerValue];
        voice.localImage = [nodeDict objectForKey:@"localImage"];
        voice.timestampStr = [nodeDict objectForKey:@"timestampStr"];
        voice.localImage = [self getHomeworkImageWithModel:voice];
        [nodeArr addObject:voice];
    }
     return nodeArr;
}

-(NSArray <SSTEditTaskSujectFinishedPictureModel *>*)getAllHomeworkImageModelBeforeDate:(NSString *)beforeDate {
    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    NSDictionary *keyDict = @{@"uploadDate":@(DBdatatypeNSString),
                           @"vipId":@(DBdatatypeNSString),
                           @"studentName":@(DBdatatypeNSString),
                           @"course":@(DBdatatypeNSString),
                           @"derverFileId":@(DBdatatypeNSString),
                           @"localPath":@(DBdatatypeNSString),
                           @"timestampStr":@(DBdatatypeNSString),
                           @"correctStatus":@(DBdatatypeInteger)};
    NSString *selectQuery = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE uploadDate < ?",kHOMEWORKImage_TABLE_NAME]; // 查询语句
    tempArray = [self selectInTable:kHOMEWORKImage_TABLE_NAME withKey:keyDict andQuery:selectQuery whereCondition:beforeDate];
    
    NSMutableArray *nodeArr = [NSMutableArray array];
    for (NSDictionary *nodeDict in tempArray) {
        SSTEditTaskSujectFinishedPictureModel *voice = [[SSTEditTaskSujectFinishedPictureModel alloc] init];
        voice.vipId = [nodeDict objectForKey:@"vipId"];
        voice.uploadDate = [nodeDict objectForKey:@"uploadDate"];
        voice.studentName = [nodeDict objectForKey:@"studentName"];
        voice.course = [nodeDict objectForKey:@"course"];
        voice.derverFileId = [nodeDict objectForKey:@"derverFileId"];
        voice.localPath = [nodeDict objectForKey:@"localPath"];
        voice.correctStatus = [[nodeDict objectForKey:@"correctStatus"] integerValue];
        voice.localImage = [nodeDict objectForKey:@"localImage"];
        voice.timestampStr = [nodeDict objectForKey:@"timestampStr"];
        voice.localImage = [self getHomeworkImageWithModel:voice];
        [nodeArr addObject:voice];
    }
     return nodeArr;
}

/**
 * 删除作业图片信息
 */
-(BOOL)deleteHomeworkImageModel:(SSTEditTaskSujectFinishedPictureModel *)imageModel {
    BOOL isDelete = [self deleteInTable:kHOMEWORKImage_TABLE_NAME withConditonKey:@"derverFileId" andConditonValue:imageModel.derverFileId];
    if (isDelete) {
        [self deleteUploadPhoto:imageModel];
    }
    return isDelete;
}

-(BOOL)deleteHomeworkImageModelBeforeDate:(NSString *)date{
    BOOL isAllDelete = YES;
    NSArray *imgModelArr = [self getAllHomeworkImageModelBeforeDate:date];
    for (SSTEditTaskSujectFinishedPictureModel *pModel in imgModelArr) {
        BOOL isDelete = [self deleteHomeworkImageModel:pModel];
        if (!isDelete) {
            isAllDelete = NO;
        }
    }
    return isAllDelete;
}

-(BOOL)updateImageModel:(SSTEditTaskSujectFinishedPictureModel *)imageModel withImageModelKey:(NSString *)key andImageModelValue:(NSString *)value{
    BOOL isUpdate = [self updateInTable:kHOMEWORKImage_TABLE_NAME columnName:key newValue:value whereCondition:@"derverFileId" andConditionValue:imageModel.derverFileId];
    return isUpdate;
}

-(void)saveUploadHomewrokPhoto:(SSTEditTaskSujectFinishedPictureModel *)uploadImage{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        UIImage *image = uploadImage.localImage;
        // 本地沙盒目录 + CheckHomewor + [NSDate nowDate]
        NSString *imgPath = [SSUtility getUploadHomeworkPhotoDirectoryWithSubject:uploadImage.course withDate:uploadImage.uploadDate vipId:uploadImage.vipId];
        NSString *localImagePath = [imgPath stringByAppendingFormat:@"%@",uploadImage.localPath];
        // 将取得的图片写入本地的沙盒中,其中0.5表示压缩比例,1表示不压缩,数值越小压缩比例越大
        BOOL success = [UIImageJPEGRepresentation(image,1) writeToFile:localImagePath atomically:YES];
        if (success){
            NSLog(@"上传中的作业写入本地成功");
        }
    });
}

-(UIImage*)getHomeworkImageWithModel:(SSTEditTaskSujectFinishedPictureModel *)imageModel {
    NSString *imgPath = [SSUtility getUploadHomeworkPhotoDirectoryWithSubject:imageModel.course withDate:imageModel.uploadDate vipId:imageModel.vipId];
    NSString *localImagePath = [imgPath stringByAppendingFormat:@"%@",imageModel.localPath];
    NSData *imgData = [NSData dataWithContentsOfFile:localImagePath];
    UIImage *img = [UIImage imageWithData:imgData];
    return img;
}

/**
 * 删除作业图片
*/
-(void)deleteUploadPhoto:(SSTEditTaskSujectFinishedPictureModel *)uploadImage{
    // 本地沙盒目录 + CheckHomewor + [NSDate nowDate]
    NSString *imgPath = [SSUtility getUploadHomeworkPhotoDirectoryWithSubject:uploadImage.course withDate:uploadImage.uploadDate vipId:uploadImage.vipId];
    NSString *localImagePath = [imgPath stringByAppendingFormat:@"%@",uploadImage.localPath];
    if ([[NSFileManager defaultManager] removeItemAtPath:localImagePath error:nil]) {
        NSLog(@" --- 删除成功 --- %@",uploadImage.derverFileId);
    }else {
        NSLog(@" --- 删除失败 --- %@",uploadImage.derverFileId);
    }
}

@end

三、图片异步上传逻辑

#import <Foundation/Foundation.h>
#import "SSTEditTaskModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface SSImageUploadQueueManager : NSObject

@property (nonatomic, assign) BOOL isUploading;

+ (instancetype)shareManager;

- (void)enqueueImageModel:(SSTEditTaskSujectFinishedPictureModel *)imageModel;

- (void)reUploadImageModelArr:(NSArray<SSTEditTaskSujectFinishedPictureModel *> *)imageModelArr;

- (void)deleteUpoadImageModel:(SSTEditTaskSujectFinishedPictureModel *)imageModel;

- (void)setAllUploadImageModelState:(SSTHomeworkPictureState)state;

@end

NS_ASSUME_NONNULL_END

#import "SSImageUploadQueueManager.h"
#import <AliyunOSSiOS/OSSService.h>
#import "OssfsTokenModel.h"
#import "DataBaseHelper+ImageUpload.h"

static SSImageUploadQueueManager *_manager = nil;
static dispatch_queue_t _queueUploadBegin = nil; // 创建串行队列 - 保证多次图片上传请求按顺序执行;
static dispatch_semaphore_t _semaphoreBegin = nil;

@interface SSImageUploadQueueManager ()<NSCopying,NSMutableCopying>

@property (nonatomic, strong) NSMutableArray *uploadQueue;

@end

@implementation SSImageUploadQueueManager

+ (instancetype)shareManager {
    return [[self alloc] init];
}

- (instancetype)init {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _manager = [super init];
        _uploadQueue = [NSMutableArray array];
        _queueUploadBegin = dispatch_queue_create("com.uploadHomeworkImageToOSS.xiaodiandou.tast", DISPATCH_QUEUE_SERIAL);
        _semaphoreBegin = dispatch_semaphore_create(1); // 设置信号总量为1,保证只有一个进程执行
    });
    return _manager;
}

+ (id)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _manager = [super allocWithZone:zone];
    });
    return _manager;
}

- (nonnull id)copyWithZone:(NSZone *)zone {
    return _manager;
}

- (nonnull id)mutableCopyWithZone:(NSZone *)zone {
    return _manager;
}
// 只在拍照的时候,从这里添加;
- (void)enqueueImageModel:(SSTEditTaskSujectFinishedPictureModel *)imageModel {
    [[DataBaseHelper sharedInstance] saveHomeworkImageInfo:imageModel];
    [self.uploadQueue addObject:imageModel];
    [self startUploadingIfIdle];
}

- (void)reUploadImageModelArr:(NSArray<SSTEditTaskSujectFinishedPictureModel *> *)imageModelArr {
    [self.uploadQueue addObjectsFromArray:imageModelArr];
    if (self.uploadQueue.count == imageModelArr.count) {
        [self uploadNextImageModel]; // 说明上传队列里,没有在上传的图片了,直接去上传
    }
}

- (void)deleteUpoadImageModel:(SSTEditTaskSujectFinishedPictureModel *)imageModel {
    // 定义一个标识符来查找的值
    NSString *targetIdentifier = imageModel.derverFileId;
    // 创建NSPredicate对象
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"derverFileId == %@", targetIdentifier];
    // 使用NSPredicate过滤NSArray
    NSArray *filteredArray = [self.uploadQueue filteredArrayUsingPredicate:predicate];
    // 检查是否有匹配的Model对象
    if (filteredArray.count > 0) {
        // 找到了匹配的Model对象
        for (SSTEditTaskSujectFinishedPictureModel *pModel in filteredArray) {
            [self.uploadQueue removeObject:pModel];
        }
    } else {
        // 没有找到匹配的Model对象
        NSLog(@" -- 没有找到匹配的Model对象 -- ");
    }
}

- (void)setAllUploadImageModelState:(SSTHomeworkPictureState)state {
    NSArray *uploadImgAllArr = [[DataBaseHelper sharedInstance] getAllHomeworkImageModel];
    for (SSTEditTaskSujectFinishedPictureModel *imageModel in uploadImgAllArr) {
        [[DataBaseHelper sharedInstance] updateImageModel:imageModel withImageModelKey:@"correctStatus" andImageModelValue:[NSString stringWithFormat:@"%ld",state]];
    }
}

- (SSTEditTaskSujectFinishedPictureModel *)dequeueImageModel {
    SSTEditTaskSujectFinishedPictureModel *imageModel = [self.uploadQueue firstObject];
    if (imageModel) {
        [self.uploadQueue removeObjectAtIndex:0];
    }
    return imageModel;
}

- (void)startUploadingIfIdle {
    if (self.uploadQueue.count == 1) {
        [self uploadNextImageModel];
    }
}

- (void)uploadNextImageModel {
    
    SSTEditTaskSujectFinishedPictureModel *imageModel = [self dequeueImageModel];
    if (imageModel) {
        // 执行上传操作,可以使用网络请求库(如NSURLSession)将图片上传到服务器
        // 在上传完成后的回调中,调用 [self uploadNextImage] 继续上传下一张图片
        // 在上传失败或取消时,可以根据需要进行错误处理或重试
        WS(weakSelf);
        self.isUploading = YES;
        dispatch_async(_queueUploadBegin, ^{
            //等待信号量
            dispatch_semaphore_wait(_semaphoreBegin, DISPATCH_TIME_FOREVER);
                NSString *accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:kUserToken];
                NSString *urlString = [HTTP_upload_getOssfsToken stringByAppendingString:[NSString stringWithFormat:@"?accessToken=%@",accessToken]];

            //[[DataBaseHelper sharedInstance] updateImageModel:imageModel withImageModelKey:@"correctStatus" andImageModelValue:@"11"];

                [XWHttpClient xw_postWithUrlString:urlString Params:nil DefaultHUD:NO RepeatNum:1 TimeOutSecond:10 SuccessBlock:^(id returnValue) {
                    NSLog(@"  ----- getOssfsToken - returnValue: %@",returnValue);
                    //处理耗时操作的代码块...
                    dispatch_async(dispatch_get_global_queue(0, 0), ^{
                        OssfsTokenModel *ossfsTokenModel = [OssfsTokenModel mj_objectWithKeyValues:DicGetValue(returnValue,@"data")];
                        id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:ossfsTokenModel.accessKeyId secretKeyId:ossfsTokenModel.accessKeySecret securityToken:ossfsTokenModel.securityToken];
                        OSSClient *client = [[OSSClient alloc] initWithEndpoint:ossfsTokenModel.endpoint credentialProvider:credential];
                        OSSPutObjectRequest * put = [OSSPutObjectRequest new];
                        put.bucketName = ossfsTokenModel.bucket;
                        NSString * uploadImgPath = ossfsTokenModel.uploadImgPath;
                        NSString * objectKeyStr = [uploadImgPath substringFromIndex:1]; //去掉图片路径的第一个斜杠
                        put.objectKey = objectKeyStr;
                        imageModel.localImage = [UIImage compressImage:imageModel.localImage toByte:800000];
                        NSData *imageData = UIImageJPEGRepresentation(imageModel.localImage, 1);
                        put.uploadingData = imageData; // UIImageJPEGRepresentation(img.localImage,1);
                        put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
                            NSString *sendSize = [SSUtility transformedValue:[NSNumber numberWithUnsignedLongLong:totalByteSent]];
                            NSString *totalSize = [SSUtility transformedValue:[NSNumber numberWithUnsignedLongLong:totalBytesExpectedToSend]];
                            SSLog(@"上传图片大小为: %@ --- 已上传: %@",totalSize,sendSize);
                        };
                        if (imageModel.questionRecommendRecordId) { // kHOST_ADDRESS -> kUPLOAD_ADDRESS
                            NSString *paramBody = @"{\"vipId\":${x:vipId},\"costype\":${x:costype},\"derverFileId\":${x:derverFileId},\"fileKeys\":${x:fileKeys},\"courseName\":${x:courseName},\"questionRecommendRecordId\":${x:questionRecommendRecordId}}";
                            // 正确的
                            put.callbackParam = @{@"callbackUrl":[NSString stringWithFormat:@"%@/api/parents/xy/homework/uploadPictureNoSubject?accessToken=%@",kHOST_ADDRESS,[SSUtility getUserToken]],
                                                 @"callbackBody":paramBody,
                                             @"callbackBodyType":@"application/json"};
                            put.callbackVar = @{@"x:vipId":imageModel.vipId,
                                                @"x:costype":@"1",
                                                @"x:fileKeys":uploadImgPath,
                                                @"x:courseName":imageModel.course,
                                                @"x:derverFileId":imageModel.derverFileId,
                                                @"x:questionRecommendRecordId":imageModel.questionRecommendRecordId};
                        }else {
                            NSString *paramBody = @"{\"vipId\":${x:vipId},\"costype\":${x:costype},\"derverFileId\":${x:derverFileId},\"fileKeys\":${x:fileKeys},\"courseName\":${x:courseName}}";
                            // 正确的
                            put.callbackParam = @{@"callbackUrl":[NSString stringWithFormat:@"%@/api/parents/xy/homework/uploadPictureNoSubject?accessToken=%@",kHOST_ADDRESS,[SSUtility getUserToken]],
                                                 @"callbackBody":paramBody,
                                             @"callbackBodyType":@"application/json"};
                            put.callbackVar = @{@"x:vipId":imageModel.vipId,
                                                @"x:costype":@"1",
                                                @"x:fileKeys":uploadImgPath,
                                                @"x:courseName":imageModel.course,
                                                @"x:derverFileId":imageModel.derverFileId};
                        }
                        OSSTask * putTask = [client putObject:put];
                        [putTask waitUntilFinished]; // 阻塞直到上传完成
                        [putTask continueWithBlock:^id(OSSTask *task) {
                            OSSPutObjectResult *result = task.result;
                            NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@",result.requestId,result.httpResponseHeaderFields,result.serverReturnJsonString);
                            NSDictionary *dataDict = [SSUtility dictionaryWithJsonString:result.serverReturnJsonString];
                            NSString *codeStr = dataDict[@"code"];
                            NSString *msgStr = dataDict[@"msg"];
                            if (!task.error) {
                                if ([codeStr isEqualToString:@"999"]) {
                                    imageModel.image = uploadImgPath; // callback 成功不用回调;
                                    NSString *imgUrl = [SSUtility getImageFullPathWithServerPath:uploadImgPath];
                                    [[SDImageCache sharedImageCache] storeImage:imageModel.localImage forKey:imgUrl completion:^{
                                        NSLog(@" --- &&&&&&&&&&&&&& --- 上传图片成功 --- 本地保存 --- ");
                                    }];
                                    // 上传成功后,删除本地图片数据
                                    [[DataBaseHelper sharedInstance] deleteHomeworkImageModel:imageModel];
//                                    if (successBlock) {
//                                        successBlock(dataDict);
//                                    }
                                    NSLog(@"upload object success!");
                                }else {
                                    dispatch_async(dispatch_get_main_queue(), ^{
                                        [[SSCustomAlertView alloc] setAlertViewTitle:@"" andMessage:msgStr ? msgStr : @"作业上传失败" andhideAlertViewTimeOut:kDefaultAlertTime];
                                    });
//                                    if (errorBlock) {
//                                        errorBlock(task.error);
//                                    }
                                    [[DataBaseHelper sharedInstance] updateImageModel:imageModel withImageModelKey:@"correctStatus" andImageModelValue:@"6"];
                                }
                            } else {
                                NSLog(@"upload object failed, error: %@" , task.error);
                                dispatch_async(dispatch_get_main_queue(), ^{
                                    [[SSCustomAlertView alloc] setAlertViewTitle:@"" andMessage:msgStr ? msgStr : @"作业上传失败" andhideAlertViewTimeOut:kDefaultAlertTime];
                                });
//                                if (errorBlock) {
//                                    errorBlock(task.error);
//                                }
                                [[DataBaseHelper sharedInstance] updateImageModel:imageModel withImageModelKey:@"correctStatus" andImageModelValue:@"6"];

                            }
                            [weakSelf uploadNextImageModel]; // 上传下一张
                            [[NSNotificationCenter defaultCenter] postNotificationName:kUploadImgSuccessNotificationName object:imageModel]; // 提示页面刷新
                            dispatch_semaphore_signal(_semaphoreBegin);
                            task = [client presignPublicURLWithBucketName:ossfsTokenModel.bucket withObjectKey:objectKeyStr];
                            return nil;
                        }];
                    });
                    
                } ErrorBlock:^(id errorCode) {
//                    if (errorBlock) {
//                        errorBlock(errorCode);
//                    }
                    [[DataBaseHelper sharedInstance] updateImageModel:imageModel withImageModelKey:@"correctStatus" andImageModelValue:@"6"];
                    [weakSelf uploadNextImageModel]; // 上传下一张
                    [[NSNotificationCenter defaultCenter] postNotificationName:kUploadImgSuccessNotificationName object:imageModel]; // 提示页面刷新
                    dispatch_semaphore_signal(_semaphoreBegin);
                } FailureBlock:^(id failureInfo) {
//                    if (failBlock) {
//                        failBlock(failureInfo);
//                    }
                    [[DataBaseHelper sharedInstance] updateImageModel:imageModel withImageModelKey:@"correctStatus" andImageModelValue:@"6"];
                    [weakSelf uploadNextImageModel]; // 上传下一张
                    [[NSNotificationCenter defaultCenter] postNotificationName:kUploadImgSuccessNotificationName object:imageModel]; // 提示页面刷新
                    dispatch_semaphore_signal(_semaphoreBegin);
                }];
        
        });

    }else { // 如果有imageModel
        self.isUploading = NO;
    }
    
}

@end

四、拍照上传操作

    // 上传作业图片
    SSTEditTaskSujectFinishedPictureModel *subjectFinishPictureModel = [[SSTEditTaskSujectFinishedPictureModel alloc] init];
    NSTimeInterval endTime = [[NSDate date] timeIntervalSince1970]*1000;// *1000 是精确到毫秒,不乘就是精确到秒
    NSInteger uploadTime = endTime;
    NSString *localImagePath = [NSString stringWithFormat:@"%@-%zd.jpg",[SSUtility getUserVipId],uploadTime];
    subjectFinishPictureModel.course = self.subject;
    subjectFinishPictureModel.vipId = [SSUtility getUserVipId];
    //subjectFinishPictureModel.uploadDate = [NSDate getDate:[NSDate date] day:4]; // 测试
    subjectFinishPictureModel.uploadDate = [NSDate getDateStringWithNowDate:[NSDate date]];
    subjectFinishPictureModel.derverFileId = [NSString stringWithFormat:@"%@-%zd",[SSUtility getUserVipId],uploadTime];
    subjectFinishPictureModel.localPath = localImagePath;
    subjectFinishPictureModel.timestampStr = [NSString stringWithFormat:@"%zd",uploadTime];
    subjectFinishPictureModel.localImage = _photopImage;
    subjectFinishPictureModel.correctStatus = SSTHomeworkPictureStateUploading; // 上传中
    subjectFinishPictureModel.studentName = [SSUtility getUserCurrentChildName];
    //subjectFinishPictureModel.isLocalData = YES;
    //[[SSTUploadHomeworkPictureManager shareManager] saveUploadingHomewrokPhoto:subjectFinishPictureModel withVipId:self.vipId subject:self.courseName];

    [[SSImageUploadQueueManager shareManager] enqueueImageModel:subjectFinishPictureModel];

五、上传列表数据获取

    NSArray *uploadImgAllArr = [[DataBaseHelper sharedInstance] getAllHomeworkImageModel];
    NSMutableArray *uploadImgErrorArr = [NSMutableArray array];
    for (SSTEditTaskSujectFinishedPictureModel *imageModel in uploadImgAllArr) {
        if (imageModel.correctStatus == SSTHomeworkPictureStateUploadFail) {
            [uploadImgErrorArr addObject:imageModel];
        }
    }
    [self.uploadImgArr removeAllObjects];
    [self.uploadImgArr addObjectsFromArray:uploadImgAllArr];
    [self.uploadImgErrorArr removeAllObjects];
    [self.uploadImgErrorArr addObjectsFromArray:uploadImgErrorArr];
    dispatch_async(dispatch_get_main_queue(), ^{
        self.rightBtn.hidden = uploadImgErrorArr.count > 0 ? NO : YES;
        [self.tableView reloadData];
    });

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS开发上传图片可以采用以下步骤: 1.选择要上传图片,可以使用系统提供的UIImagePickerController控制器,或者使用第三方库,例如TZImagePickerController。 2.将选中的图片转换为NSData格式。 3.使用NSURLSession或AFNetworking等网络库,将图片数据上传到服务器。 以下是一个简单的上传图片的示例代码: ``` // 选择图片 UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.delegate = self; [self presentViewController:imagePicker animated:YES completion:nil]; // 将选中的图片转换为NSData格式 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info { UIImage *selectedImage = info[UIImagePickerControllerOriginalImage]; NSData *imageData = UIImageJPEGRepresentation(selectedImage, 0.5); // 上传图片到服务器 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; NSURL *url = [NSURL URLWithString:@"http://example.com/upload.php"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 处理服务器返回的响应 }]; [uploadTask resume]; [picker dismissViewControllerAnimated:YES completion:nil]; } ``` 其中,upload.php是服务器端接收图片的脚本文件。在服务器端,可以使用PHP等语言来处理上传图片数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值