Просмотр исходного кода

RA Image
上传队列加线程锁,解决线程安全性问题。

Ray Zhang 9 лет назад
Родитель
Сommit
361ea6d460
2 измененных файлов с 23 добавлено и 11 удалено
  1. 1 1
      common/upload/RAUploadManager.h
  2. 22 10
      common/upload/RAUploadManager.m

+ 1 - 1
common/upload/RAUploadManager.h

@@ -32,7 +32,7 @@
 @property (assign) bool removeError;
 @property (assign) bool autoStart;
 
-
+@property (strong,nonatomic) NSLock* arr_queue_lock;
 
 @property (strong,nonatomic) NSOperationQueue* operation_queue;
 

+ 22 - 10
common/upload/RAUploadManager.m

@@ -38,6 +38,7 @@
         
         self.operation_queue = [NSOperationQueue new];
         self.operation_queue.maxConcurrentOperationCount = self.maxThread;
+        self.arr_queue_lock = [NSLock new];
         
          [self loadTasks];
 //        self.backgroundColor = [UIColor clearColor];
@@ -72,7 +73,12 @@
     
 //    [self.arr_queue addObject:task];
    
+    [self.arr_queue_lock lock];
     [[self mutableArrayValueForKey:@"arr_queue"] addObject:task];
+    [self.arr_queue_lock unlock];
+    
+    
+    
     if(self.newtaskStatus==TaskStatusWait)
     {
         
@@ -84,7 +90,12 @@
 }
 -(void) addTasks:(NSMutableArray*) tasks
 {
-     [[self mutableArrayValueForKey:@"arr_queue"] addObjectsFromArray:tasks];
+    [self.arr_queue_lock lock];
+    [[self mutableArrayValueForKey:@"arr_queue"] addObjectsFromArray:tasks];
+    [self.arr_queue_lock unlock];
+    
+    
+    
     if(self.newtaskStatus==TaskStatusWait)
     {
         for(NSMutableDictionary* task in tasks)
@@ -106,7 +117,13 @@
         NSError* error = nil;
         [fmanager removeItemAtPath:[self filePath:task] error:&error];
     }
+    
+    
+    
+    [self.arr_queue_lock lock];
     [[self mutableArrayValueForKey:@"arr_queue"] removeObjectsInArray:tasks];
+    [self.arr_queue_lock unlock];
+    
 //    if (self.delegate && [self.delegate respondsToSelector:@selector(uploadManager:didRemoveTasks:)]) {
 //        [self.delegate uploadManager:self didRemoveTasks:tasks];
 //    }
@@ -120,16 +137,11 @@
     NSError* error = nil;
     [fmanager removeItemAtPath:[self filePath:task] error:&error];
     
-    @try {
-        [[self mutableArrayValueForKey:@"arr_queue"] removeObject:task];
-    } @catch (NSException *exception) {
-        NSLog(@"%@\n%@",exception.name,exception.reason);
-    } @finally {
-        
-    }
-    
-    
     
+    [self.arr_queue_lock lock];
+    [[self mutableArrayValueForKey:@"arr_queue"] removeObject:task];
+    [self.arr_queue_lock unlock];
+
 //    if (self.delegate && [self.delegate respondsToSelector:@selector(uploadManager:didRemoveTasks:)]) {
 //        [self.delegate uploadManager:self didRemoveTasks:@[task]];
 //    }