123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- //
- // QNUploadBlock.m
- // QiniuSDK
- //
- // Created by yangsen on 2021/5/10.
- // Copyright © 2021 Qiniu. All rights reserved.
- //
- #import "QNUploadBlock.h"
- @interface QNUploadBlock()
- @property(nonatomic, assign)long long offset;
- @property(nonatomic, assign)NSInteger size;
- @property(nonatomic, assign)NSInteger index;
- @property(nonatomic, strong)NSArray <QNUploadData *> *uploadDataList;
- @end
- @implementation QNUploadBlock
- + (instancetype)blockFromDictionary:(NSDictionary *)dictionary{
- if (![dictionary isKindOfClass:[NSDictionary class]]) {
- return nil;
- }
-
- QNUploadBlock *block = [[QNUploadBlock alloc] init];
- block.offset = [dictionary[@"offset"] longLongValue];
- block.size = [dictionary[@"size"] integerValue];
- block.index = [dictionary[@"index"] integerValue];
- block.expiredAt = dictionary[@"expired_at"];
- block.md5 = dictionary[@"md5"];
- block.context = dictionary[@"context"];
-
- NSArray *uploadDataInfos = dictionary[@"uploadDataList"];
- if ([uploadDataInfos isKindOfClass:[NSArray class]]) {
-
- NSMutableArray *uploadDataList = [NSMutableArray array];
- for (NSDictionary *uploadDataInfo in uploadDataInfos) {
- QNUploadData *data = [QNUploadData dataFromDictionary:uploadDataInfo];
- if (!data) {
- return nil;
- }
- [uploadDataList addObject:data];
- }
- block.uploadDataList = [uploadDataList copy];
- }
- return block;
- }
- - (instancetype)initWithOffset:(long long)offset
- blockSize:(NSInteger)blockSize
- dataSize:(NSInteger)dataSize
- index:(NSInteger)index {
- if (self = [super init]) {
- _offset = offset;
- _size = blockSize;
- _index = index;
- _uploadDataList = [self createDataList:dataSize];
- }
- return self;
- }
- - (BOOL)isValid {
- if (!self.expiredAt || self.expiredAt.integerValue <= 0) {
- // 不存在时,为新创建 block: 有效
- return true;
- }
-
- // 存在则有效期必须为过期
- return (self.expiredAt.doubleValue - 2*3600) > [[NSDate date] timeIntervalSince1970];
- }
- - (BOOL)isCompleted{
- if (self.uploadDataList == nil) {
- return true;
- }
-
- BOOL isCompleted = true;
- for (QNUploadData *data in self.uploadDataList) {
- if (data.isUploaded == false) {
- isCompleted = false;
- break;
- }
- }
- return isCompleted;
- }
- - (NSInteger)uploadSize {
- if (self.uploadDataList == nil) {
- return 0;
- }
- NSInteger uploadSize = 0;
- for (QNUploadData *data in self.uploadDataList) {
- uploadSize += data.uploadSize;
- }
- return uploadSize;
- }
- - (NSArray *)createDataList:(long long)dataSize{
-
- long long offSize = 0;
- NSInteger dataIndex = 0;
- NSMutableArray *datas = [NSMutableArray array];
- while (offSize < self.size) {
- long long lastSize = self.size - offSize;
- long long dataSizeP = MIN(lastSize, dataSize);
- QNUploadData *data = [[QNUploadData alloc] initWithOffset:offSize
- dataSize:dataSizeP
- index:dataIndex];
- [datas addObject:data];
- offSize += dataSizeP;
- dataIndex += 1;
- }
- return [datas copy];
- }
- - (QNUploadData *)nextUploadDataWithoutCheckData {
- if (!self.uploadDataList || self.uploadDataList.count == 0) {
- return nil;
- }
-
- QNUploadData *data = nil;
- for (QNUploadData *dataP in self.uploadDataList) {
- if ([dataP needToUpload]) {
- data = dataP;
- break;
- }
- }
- return data;
- }
- - (void)clearUploadState{
- self.md5 = nil;
- self.context = nil;
- for (QNUploadData *data in self.uploadDataList) {
- [data clearUploadState];
- }
- }
- - (void)checkInfoStateAndUpdate {
- for (QNUploadData *data in self.uploadDataList) {
- [data checkStateAndUpdate];
- }
- }
- - (NSDictionary *)toDictionary{
-
- NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
- dictionary[@"offset"] = @(self.offset);
- dictionary[@"size"] = @(self.size);
- dictionary[@"index"] = @(self.index);
- dictionary[@"expired_at"] = self.expiredAt ?: @(0);
- dictionary[@"md5"] = self.md5 ?: @"";
- if (self.context) {
- dictionary[@"context"] = self.context;
- }
- if (self.uploadDataList) {
-
- NSMutableArray *uploadDataInfos = [NSMutableArray array];
- for (QNUploadData *data in self.uploadDataList) {
-
- NSDictionary *uploadDataInfo = [data toDictionary];
- if (uploadDataInfo) {
- [uploadDataInfos addObject:uploadDataInfo];
- }
- }
- dictionary[@"uploadDataList"] = [uploadDataInfos copy];
- }
-
- return [dictionary copy];
- }
- @end
|