QNUploadFileInfoPartV1.m 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. //
  2. // QNUploadFileInfoPartV1.m
  3. // QiniuSDK
  4. //
  5. // Created by yangsen on 2020/11/30.
  6. // Copyright © 2020 Qiniu. All rights reserved.
  7. //
  8. #import "QNUploadFileInfoPartV1.h"
  9. @interface QNUploadBlock()
  10. @property(nonatomic, assign)long long offset;
  11. @property(nonatomic, assign)long long 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"] longLongValue];
  23. block.index = [dictionary[@"index"] integerValue];
  24. block.context = dictionary[@"context"];
  25. NSArray *uploadDataInfos = dictionary[@"uploadDataList"];
  26. if ([uploadDataInfos isKindOfClass:[NSArray class]]) {
  27. NSMutableArray *uploadDataList = [NSMutableArray array];
  28. for (NSDictionary *uploadDataInfo in uploadDataInfos) {
  29. QNUploadData *data = [QNUploadData dataFromDictionary:uploadDataInfo];
  30. if (data) {
  31. [uploadDataList addObject:data];
  32. }
  33. }
  34. block.uploadDataList = [uploadDataList copy];
  35. }
  36. return block;
  37. }
  38. - (instancetype)initWithOffset:(long long)offset
  39. blockSize:(NSInteger)blockSize
  40. dataSize:(NSInteger)dataSize
  41. index:(NSInteger)index {
  42. if (self = [super init]) {
  43. _offset = offset;
  44. _size = blockSize;
  45. _index = index;
  46. [self createDataList:dataSize];
  47. }
  48. return self;
  49. }
  50. - (BOOL)isCompleted{
  51. BOOL isCompleted = YES;
  52. for (QNUploadData *data in self.uploadDataList) {
  53. if (data.isCompleted == NO) {
  54. isCompleted = NO;
  55. break;
  56. }
  57. }
  58. return isCompleted;
  59. }
  60. - (float)progress{
  61. float progress = 0;
  62. for (QNUploadData *data in self.uploadDataList) {
  63. progress += data.progress * ((float)data.size / (float)self.size);
  64. }
  65. return progress;
  66. }
  67. - (void)createDataList:(long long)dataSize{
  68. long long offSize = 0;
  69. NSInteger dataIndex = 1; /// 从1开始 兼容分片v2
  70. NSMutableArray *datas = [NSMutableArray array];
  71. while (offSize < self.size) {
  72. long long lastSize = self.size - offSize;
  73. long long dataSizeP = MIN(lastSize, dataSize);
  74. QNUploadData *data = [[QNUploadData alloc] initWithOffset:offSize
  75. dataSize:dataSizeP
  76. index:dataIndex];
  77. [datas addObject:data];
  78. offSize += dataSizeP;
  79. dataIndex += 1;
  80. }
  81. self.uploadDataList = [datas copy];
  82. }
  83. - (QNUploadData *)nextUploadData{
  84. if (!self.uploadDataList || self.uploadDataList.count == 0) {
  85. return nil;
  86. }
  87. QNUploadData *data = nil;
  88. for (QNUploadData *dataP in self.uploadDataList) {
  89. if (!dataP.isCompleted && !dataP.isUploading) {
  90. data = dataP;
  91. break;
  92. }
  93. }
  94. return data;
  95. }
  96. - (void)clearUploadState{
  97. self.context = nil;
  98. for (QNUploadData *data in self.uploadDataList) {
  99. [data clearUploadState];
  100. }
  101. }
  102. - (NSDictionary *)toDictionary{
  103. NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
  104. dictionary[@"offset"] = @(self.offset);
  105. dictionary[@"size"] = @(self.size);
  106. dictionary[@"index"] = @(self.index);
  107. if (self.context) {
  108. dictionary[@"context"] = self.context;
  109. }
  110. if (self.uploadDataList) {
  111. NSMutableArray *uploadDataInfos = [NSMutableArray array];
  112. for (QNUploadData *data in self.uploadDataList) {
  113. NSDictionary *uploadDataInfo = [data toDictionary];
  114. if (uploadDataInfo) {
  115. [uploadDataInfos addObject:uploadDataInfo];
  116. }
  117. }
  118. dictionary[@"uploadDataList"] = [uploadDataInfos copy];
  119. }
  120. return [dictionary copy];
  121. }
  122. @end
  123. @interface QNUploadFileInfoPartV1()
  124. @property(nonatomic, assign)long long size;
  125. @property(nonatomic, assign)NSInteger modifyTime;
  126. @property(nonatomic, strong)NSArray <QNUploadBlock *> *uploadBlocks;
  127. @end
  128. @implementation QNUploadFileInfoPartV1
  129. @synthesize size = _size;
  130. @synthesize modifyTime = _modifyTime;
  131. + (instancetype)infoFromDictionary:(NSDictionary *)dictionary{
  132. if (![dictionary isKindOfClass:[NSDictionary class]]) {
  133. return nil;
  134. }
  135. QNUploadFileInfoPartV1 *fileInfo = [[QNUploadFileInfoPartV1 alloc] init];
  136. fileInfo.size = [dictionary[@"size"] longLongValue];
  137. fileInfo.modifyTime = [dictionary[@"modifyTime"] integerValue];
  138. NSArray *uploadBlocksInfos = dictionary[@"uploadBlocks"];
  139. if ([uploadBlocksInfos isKindOfClass:[NSArray class]]) {
  140. NSMutableArray *uploadBlocks = [NSMutableArray array];
  141. for (NSDictionary *uploadBlock in uploadBlocksInfos) {
  142. QNUploadBlock *block = [QNUploadBlock blockFromDictionary:uploadBlock];
  143. if (block) {
  144. [uploadBlocks addObject:block];
  145. }
  146. }
  147. fileInfo.uploadBlocks = [uploadBlocks copy];
  148. }
  149. return fileInfo;
  150. }
  151. - (instancetype)initWithFileSize:(long long)fileSize
  152. blockSize:(long long)blockSize
  153. dataSize:(long long)dataSize
  154. modifyTime:(NSInteger)modifyTime{
  155. if (self = [super init]) {
  156. _size = fileSize;
  157. _modifyTime = modifyTime;
  158. [self createBlocks:blockSize dataSize:dataSize];
  159. }
  160. return self;
  161. }
  162. - (void)createBlocks:(long long)blockSize dataSize:(long long)dataSize{
  163. long long offSize = 0;
  164. NSInteger blockIndex = 0;
  165. NSMutableArray *blocks = [NSMutableArray array];
  166. while (offSize < self.size) {
  167. long long lastSize = self.size - offSize;
  168. long long blockSizeP = MIN(lastSize, blockSize);
  169. QNUploadBlock *block = [[QNUploadBlock alloc] initWithOffset:offSize
  170. blockSize:blockSizeP
  171. dataSize:dataSize
  172. index:blockIndex];
  173. [blocks addObject:block];
  174. offSize += blockSizeP;
  175. blockIndex += 1;
  176. }
  177. self.uploadBlocks = [blocks copy];
  178. }
  179. - (QNUploadBlock *)nextUploadBlock{
  180. if (!self.uploadBlocks || self.uploadBlocks.count == 0) {
  181. return nil;
  182. }
  183. QNUploadBlock *block = nil;
  184. for (QNUploadBlock *blockP in self.uploadBlocks) {
  185. if ([blockP nextUploadData]) {
  186. block = blockP;
  187. break;
  188. }
  189. }
  190. return block;
  191. }
  192. - (void)clearUploadState{
  193. for (QNUploadBlock *block in self.uploadBlocks) {
  194. [block clearUploadState];
  195. }
  196. }
  197. - (BOOL)isAllUploaded{
  198. BOOL isAllUploaded = YES;
  199. for (QNUploadBlock *block in self.uploadBlocks) {
  200. if (!block.isCompleted) {
  201. isAllUploaded = NO;
  202. break;
  203. }
  204. }
  205. return isAllUploaded;
  206. }
  207. - (float)progress{
  208. float progress = 0;
  209. for (QNUploadBlock *block in self.uploadBlocks) {
  210. progress += block.progress * ((float)block.size / (float)self.size);
  211. }
  212. return progress;
  213. }
  214. - (BOOL)isEmpty{
  215. return !self.uploadBlocks || self.uploadBlocks.count == 0;
  216. }
  217. - (BOOL)isValid{
  218. return ![self isEmpty];
  219. }
  220. - (NSArray <NSString *> *)allBlocksContexts{
  221. if (!self.uploadBlocks || self.uploadBlocks.count == 0) {
  222. return nil;
  223. }
  224. NSMutableArray *contexts = [NSMutableArray array];
  225. for (QNUploadBlock *block in self.uploadBlocks) {
  226. if (block.context) {
  227. [contexts addObject:block.context];
  228. }
  229. }
  230. return [contexts copy];
  231. }
  232. - (NSDictionary *)toDictionary{
  233. NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
  234. dictionary[@"size"] = @(self.size);
  235. dictionary[@"modifyTime"] = @(self.modifyTime);
  236. if (self.uploadBlocks) {
  237. NSMutableArray *uploadBlockInfos = [NSMutableArray array];
  238. for (QNUploadBlock *block in self.uploadBlocks) {
  239. NSDictionary *uploadBlockInfo = [block toDictionary];
  240. if (uploadBlockInfo) {
  241. [uploadBlockInfos addObject:uploadBlockInfo];
  242. }
  243. }
  244. dictionary[@"uploadBlocks"] = [uploadBlockInfos copy];
  245. }
  246. return [dictionary copy];
  247. }
  248. @end