RAUploadManager.m 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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.arr_queue = [[NSMutableArray alloc] init];
  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) stopTask:(NSMutableDictionary*) task
  101. {
  102. if([task[@"status"] intValue]!=TaskStatusStart&&[task[@"status"] intValue]!=TaskStatusWait)
  103. return; // task 已停止,返回
  104. RAUploadOperation* operation = task[@"operation"];
  105. [operation cancel];
  106. task[@"status"] = [NSNumber numberWithInt:TaskStatusStop] ;
  107. task[@"progress"] = [NSNumber numberWithDouble:0.0];
  108. }
  109. -(void) startTask:(NSMutableDictionary*) task
  110. {
  111. __block NSMutableDictionary* block_task = task;
  112. __weak typeof(self) weakSelf = self;
  113. if([task[@"status"] intValue]==TaskStatusStart||[task[@"status"] intValue]==TaskStatusWait)
  114. return; // task 已在执行队列,返回
  115. RAUploadOperation* operation = [[RAUploadOperation alloc] initWithTaskinfo:task retry:self.maxRetry];
  116. [operation setCompletionBlock:^{
  117. switch ([block_task[@"status"] intValue]) {
  118. case TaskStatusFinish:
  119. {
  120. if(weakSelf.removeFinish)
  121. [self removeTask:block_task];
  122. }
  123. break;
  124. case TaskStatusError:
  125. {
  126. if(weakSelf.removeError)
  127. [self removeTask:block_task];
  128. }
  129. break;
  130. default:
  131. break;
  132. }
  133. }];
  134. task[@"operation"] = operation;
  135. task[@"status"] = [NSNumber numberWithInt:self.newtaskStatus] ;
  136. [self.operation_queue addOperation:operation];
  137. }
  138. //- (void) uploadTask:(NSMutableDictionary*) task url:(NSString*)url{
  139. //
  140. //// __weak typeof(self) weakself = self;
  141. //
  142. //
  143. //
  144. //
  145. //}
  146. @end