QNUploadBlock.m 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. //
  2. // QNUploadBlock.m
  3. // QiniuSDK
  4. //
  5. // Created by yangsen on 2021/5/10.
  6. // Copyright © 2021 Qiniu. All rights reserved.
  7. //
  8. #import "QNUploadBlock.h"
  9. @interface QNUploadBlock()
  10. @property(nonatomic, assign)long long offset;
  11. @property(nonatomic, assign)NSInteger size;
  12. @property(nonatomic, assign)NSInteger index;
  13. @property(nonatomic, strong)NSArray <QNUploadData *> *uploadDataList;
  14. @end
  15. @implementation QNUploadBlock
  16. + (instancetype)blockFromDictionary:(NSDictionary *)dictionary{
  17. if (![dictionary isKindOfClass:[NSDictionary class]]) {
  18. return nil;
  19. }
  20. QNUploadBlock *block = [[QNUploadBlock alloc] init];
  21. block.offset = [dictionary[@"offset"] longLongValue];
  22. block.size = [dictionary[@"size"] integerValue];
  23. block.index = [dictionary[@"index"] integerValue];
  24. block.expiredAt = dictionary[@"expired_at"];
  25. block.md5 = dictionary[@"md5"];
  26. block.context = dictionary[@"context"];
  27. NSArray *uploadDataInfos = dictionary[@"uploadDataList"];
  28. if ([uploadDataInfos isKindOfClass:[NSArray class]]) {
  29. NSMutableArray *uploadDataList = [NSMutableArray array];
  30. for (NSDictionary *uploadDataInfo in uploadDataInfos) {
  31. QNUploadData *data = [QNUploadData dataFromDictionary:uploadDataInfo];
  32. if (!data) {
  33. return nil;
  34. }
  35. [uploadDataList addObject:data];
  36. }
  37. block.uploadDataList = [uploadDataList copy];
  38. }
  39. return block;
  40. }
  41. - (instancetype)initWithOffset:(long long)offset
  42. blockSize:(NSInteger)blockSize
  43. dataSize:(NSInteger)dataSize
  44. index:(NSInteger)index {
  45. if (self = [super init]) {
  46. _offset = offset;
  47. _size = blockSize;
  48. _index = index;
  49. _uploadDataList = [self createDataList:dataSize];
  50. }
  51. return self;
  52. }
  53. - (BOOL)isValid {
  54. if (!self.expiredAt || self.expiredAt.integerValue <= 0) {
  55. // 不存在时,为新创建 block: 有效
  56. return true;
  57. }
  58. // 存在则有效期必须为过期
  59. return (self.expiredAt.doubleValue - 2*3600) > [[NSDate date] timeIntervalSince1970];
  60. }
  61. - (BOOL)isCompleted{
  62. if (self.uploadDataList == nil) {
  63. return true;
  64. }
  65. BOOL isCompleted = true;
  66. for (QNUploadData *data in self.uploadDataList) {
  67. if (data.isUploaded == false) {
  68. isCompleted = false;
  69. break;
  70. }
  71. }
  72. return isCompleted;
  73. }
  74. - (NSInteger)uploadSize {
  75. if (self.uploadDataList == nil) {
  76. return 0;
  77. }
  78. NSInteger uploadSize = 0;
  79. for (QNUploadData *data in self.uploadDataList) {
  80. uploadSize += data.uploadSize;
  81. }
  82. return uploadSize;
  83. }
  84. - (NSArray *)createDataList:(long long)dataSize{
  85. long long offSize = 0;
  86. NSInteger dataIndex = 0;
  87. NSMutableArray *datas = [NSMutableArray array];
  88. while (offSize < self.size) {
  89. long long lastSize = self.size - offSize;
  90. long long dataSizeP = MIN(lastSize, dataSize);
  91. QNUploadData *data = [[QNUploadData alloc] initWithOffset:offSize
  92. dataSize:dataSizeP
  93. index:dataIndex];
  94. [datas addObject:data];
  95. offSize += dataSizeP;
  96. dataIndex += 1;
  97. }
  98. return [datas copy];
  99. }
  100. - (QNUploadData *)nextUploadDataWithoutCheckData {
  101. if (!self.uploadDataList || self.uploadDataList.count == 0) {
  102. return nil;
  103. }
  104. QNUploadData *data = nil;
  105. for (QNUploadData *dataP in self.uploadDataList) {
  106. if ([dataP needToUpload]) {
  107. data = dataP;
  108. break;
  109. }
  110. }
  111. return data;
  112. }
  113. - (void)clearUploadState{
  114. self.md5 = nil;
  115. self.context = nil;
  116. for (QNUploadData *data in self.uploadDataList) {
  117. [data clearUploadState];
  118. }
  119. }
  120. - (void)checkInfoStateAndUpdate {
  121. for (QNUploadData *data in self.uploadDataList) {
  122. [data checkStateAndUpdate];
  123. }
  124. }
  125. - (NSDictionary *)toDictionary{
  126. NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
  127. dictionary[@"offset"] = @(self.offset);
  128. dictionary[@"size"] = @(self.size);
  129. dictionary[@"index"] = @(self.index);
  130. dictionary[@"expired_at"] = self.expiredAt ?: @(0);
  131. dictionary[@"md5"] = self.md5 ?: @"";
  132. if (self.context) {
  133. dictionary[@"context"] = self.context;
  134. }
  135. if (self.uploadDataList) {
  136. NSMutableArray *uploadDataInfos = [NSMutableArray array];
  137. for (QNUploadData *data in self.uploadDataList) {
  138. NSDictionary *uploadDataInfo = [data toDictionary];
  139. if (uploadDataInfo) {
  140. [uploadDataInfos addObject:uploadDataInfo];
  141. }
  142. }
  143. dictionary[@"uploadDataList"] = [uploadDataInfos copy];
  144. }
  145. return [dictionary copy];
  146. }
  147. @end