RAUploadManager.m 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. //
  2. // RAUploadManager.m
  3. // test_autolayout
  4. //
  5. // Created by Ray on 02/05/2017.
  6. // Copyright © 2017 USAI. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import "RAUploadManager.h"
  10. #import "NetworkUtils.h"
  11. #import "RAUtils.h"
  12. @implementation RAUploadManager
  13. - (instancetype)init {
  14. if (self = [super init]) {
  15. [self loadTasks];
  16. self.newtaskStatus = TaskStatusWait;
  17. self.maxThread = 3;
  18. self.removeError=true;
  19. self.removeFinish = true;
  20. self.operation_queue = [NSOperationQueue new];
  21. self.operation_queue.maxConcurrentOperationCount = self.maxThread;
  22. // self.backgroundColor = [UIColor clearColor];
  23. }
  24. return self;
  25. }
  26. //-(void) upload:(NSString*) url
  27. //{
  28. // while(self.activeThread<self.maxThread)
  29. // {
  30. // bool nomore=false;
  31. // for(int i=0;i<self.arr_queue.count;i++)
  32. // {
  33. // NSMutableDictionary* task = self.arr_queue[i];
  34. //
  35. // TaskStatus ts=[task[@"status"] intValue];
  36. // if (ts==TaskStatusWait) {
  37. // self.activeThread--;
  38. // [self uploadTask:task url:url];
  39. // break;
  40. // }
  41. // if(i==self.arr_queue.count-1)
  42. // nomore=true;
  43. //
  44. // }
  45. // if(nomore)
  46. // break;
  47. // }
  48. //}
  49. -(void) addTask:(NSMutableDictionary*) task
  50. {
  51. // [self.arr_queue addObject:task];
  52. if(self.newtaskStatus==TaskStatusWait)
  53. {
  54. [self startTask:task];
  55. }
  56. [[self mutableArrayValueForKey:@"arr_queue"] addObject:task];
  57. }
  58. -(void) addTasks:(NSMutableArray*) tasks
  59. {
  60. if(self.newtaskStatus==TaskStatusWait)
  61. {
  62. for(NSMutableDictionary* task in tasks)
  63. [self startTask:task];
  64. }
  65. [[self mutableArrayValueForKey:@"arr_queue"] addObjectsFromArray:tasks];
  66. }
  67. -(void) removeTasks:(NSMutableArray*) tasks
  68. {
  69. NSFileManager* fmanager = [NSFileManager new];
  70. for(NSMutableDictionary* task in tasks)
  71. {
  72. [self stopTask:task];
  73. NSError* error = nil;
  74. [fmanager removeItemAtPath:[self filePath:task] error:&error];
  75. }
  76. [[self mutableArrayValueForKey:@"arr_queue"] removeObjectsInArray:tasks];
  77. // if (self.delegate && [self.delegate respondsToSelector:@selector(uploadManager:didRemoveTasks:)]) {
  78. // [self.delegate uploadManager:self didRemoveTasks:tasks];
  79. // }
  80. }
  81. -(void) removeTask:(NSMutableDictionary*) task
  82. {
  83. NSFileManager* fmanager = [NSFileManager new];
  84. // [self.arr_queue addObject:task];
  85. [self stopTask:task];
  86. NSError* error = nil;
  87. [fmanager removeItemAtPath:[self filePath:task] error:&error];
  88. [[self mutableArrayValueForKey:@"arr_queue"] removeObject:task];
  89. // if (self.delegate && [self.delegate respondsToSelector:@selector(uploadManager:didRemoveTasks:)]) {
  90. // [self.delegate uploadManager:self didRemoveTasks:@[task]];
  91. // }
  92. }
  93. -(NSString*)filePath:(NSMutableDictionary*)task
  94. {
  95. NSString *path = [RAUtils appCacheDirectory];
  96. path= [path stringByAppendingPathComponent:task[@"path"]];
  97. path= [path stringByAppendingPathComponent:task[@"file"]];
  98. return path;
  99. }
  100. -(void) saveTasks
  101. {
  102. NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
  103. [defaults setObject:self.arr_queue forKey:@"upload_queue"];
  104. [defaults synchronize];
  105. }
  106. -(void) loadTasks
  107. {
  108. [self stopAllTasks];
  109. NSMutableArray* arr = [[NSUserDefaults standardUserDefaults] objectForKey:@"upload_queue"];
  110. if(arr!=nil)
  111. self.arr_queue=arr;
  112. else
  113. self.arr_queue= [[NSMutableArray alloc] init];
  114. for(NSMutableDictionary* task in arr)
  115. {
  116. // if([task[@"status"] intValue]==TaskStatusStart)
  117. // task[@"status"]=[NSNumber numberWithInteger:TaskStatusWait];
  118. if(self.autoStart&&[task[@"status"] intValue]!=TaskStatusError&&[task[@"status"] intValue]!=TaskStatusFinish)
  119. [self startTask:task];
  120. }
  121. }
  122. -(void) stopAllTasks
  123. {
  124. for(NSMutableDictionary* task in self.arr_queue)
  125. {
  126. [self stopTask:task];
  127. }
  128. }
  129. -(void) stopTask:(NSMutableDictionary*) task
  130. {
  131. if([task[@"status"] intValue]!=TaskStatusStart&&[task[@"status"] intValue]!=TaskStatusWait)
  132. return; // task 已停止,返回
  133. RAUploadOperation* operation = task[@"operation"];
  134. [operation cancel];
  135. task[@"operation"]=nil;
  136. task[@"status"] = [NSNumber numberWithInt:TaskStatusStop] ;
  137. task[@"progress"] = [NSNumber numberWithDouble:0.0];
  138. }
  139. -(void) startAllTasks
  140. {
  141. for(NSMutableDictionary* task in self.arr_queue)
  142. [self startTask:task];
  143. }
  144. -(void) startTask:(NSMutableDictionary*) task
  145. {
  146. __block NSMutableDictionary* block_task = task;
  147. __weak typeof(self) weakSelf = self;
  148. if([task[@"status"] intValue]==TaskStatusStart||[task[@"status"] intValue]==TaskStatusWait)
  149. return; // task 已在执行队列,返回
  150. RAUploadOperation* operation = [[RAUploadOperation alloc] initWithTaskinfo:task retry:self.maxRetry];
  151. [operation setCompletionBlock:^{
  152. switch ([block_task[@"status"] intValue]) {
  153. case TaskStatusFinish:
  154. {
  155. if(weakSelf.removeFinish)
  156. [self removeTask:block_task];
  157. }
  158. break;
  159. case TaskStatusError:
  160. {
  161. if(weakSelf.removeError)
  162. [self removeTask:block_task];
  163. }
  164. break;
  165. default:
  166. break;
  167. }
  168. }];
  169. task[@"operation"] = operation;
  170. task[@"status"] = [NSNumber numberWithInt:self.newtaskStatus] ;
  171. [self.operation_queue addOperation:operation];
  172. }
  173. //- (void) uploadTask:(NSMutableDictionary*) task url:(NSString*)url{
  174. //
  175. //// __weak typeof(self) weakself = self;
  176. //
  177. //
  178. //
  179. //
  180. //}
  181. @end