Przeglądaj źródła

1.修改RA Image增加网络状态监测。

Pen Li 8 lat temu
rodzic
commit
e44a75712c

+ 5 - 2
common/upload/RAUploadManager.h

@@ -8,6 +8,7 @@
 
 #import <Foundation/Foundation.h>
 #import "RAUploadOperation.h"
+#import "Reachability.h"
 
 //@class RAUploadManager;
 ////@protocol RAUploadManagerDelegate <NSObject>
@@ -36,13 +37,13 @@ typedef NS_ENUM(NSInteger, QueueStatus) {
 //-(void) upload:(NSString*) url;
 -(void) addTask:(NSMutableDictionary*) task;
 -(void) addTasks:(NSMutableArray*) tasks;
-
+@property (nonatomic,assign) BOOL onlyWiFi;
 @property (assign) bool removeFinish;
 @property (assign) bool removeError;
 @property (assign) bool autoStart;
 @property (assign) QueueStatus queue_status;
 
-
+@property (nonatomic,strong) Reachability *reach;
 //@property (strong,nonatomic) NSLock* arr_queue_lock;
 
 @property (strong,nonatomic) NSOperationQueue* operation_queue;
@@ -54,4 +55,6 @@ typedef NS_ENUM(NSInteger, QueueStatus) {
 -(void) saveTasks;
 //@property (nonatomic,weak) id <RAUploadManagerDelegate> delegate;
 
+- (BOOL)canUpload;
+
 @end

+ 45 - 1
common/upload/RAUploadManager.m

@@ -13,10 +13,39 @@
 
 @implementation RAUploadManager
 
+
+/*!
+ * Called by Reachability whenever status changes.
+ */
+- (void) reachabilityChanged:(NSNotification *)note
+{
+    [self handleReachability:self.reach];
+}
+
+- (void)handleReachability:(Reachability *)reachability {
+    
+    NetworkStatus netStatus = [reachability currentReachabilityStatus];
+    
+    if (self.onlyWiFi && netStatus != ReachableViaWiFi) {
+        DebugLog(@"not wifi & stop task");
+        [self stopAllTasks];
+    }
+}
+
 - (instancetype)init {
     if (self = [super init]) {
         
         
+        /*
+         Observe the kNetworkReachabilityChangedNotification. When that notification is posted, the method reachabilityChanged will be called.
+         */
+        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
+        
+        NSString *remoteHostName = @"www.apple.com";
+        self.reach = [Reachability reachabilityWithHostName:remoteHostName];
+        [self.reach startNotifier];
+        [self handleReachability:self.reach];
+        
         self.queue_status = QueueStatusDefault;
         
         
@@ -27,16 +56,19 @@
             BOOL autoUpload = [[param objectForKey:@"auto_upload"] boolValue];
             BOOL autoRmFinish = [[param objectForKey:@"auto_rm_finish"] boolValue];
             BOOL autoRmErr = [[param objectForKey:@"auto_rm_error"] boolValue];
+            BOOL onlyWiFi = [[param objectForKey:@"only_wifi"] boolValue];
             int retryCount = [[param objectForKey:@"retry_count"] intValue];
             self.autoStart = autoUpload;
             self.removeFinish = autoRmFinish;
             self.removeError = autoRmErr;
             self.maxRetry = retryCount;
+            self.onlyWiFi = onlyWiFi;
         } else {
             self.autoStart = YES;
             self.removeFinish = YES;
             self.removeError = NO;
             self.maxRetry = 2;
+            self.onlyWiFi = YES;
         }
 
         
@@ -86,6 +118,7 @@
 -(void) dealloc
 {
 
+    [[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
     [self.operation_queue removeObserver:self forKeyPath:@"operationCount"];
     [self.operation_queue removeObserver:self forKeyPath:@"arr_queue"];
 }
@@ -352,7 +385,7 @@
         return; // task 已停止,返回
     }
     
-    
+    DebugLog(@"stop task");
     RAUploadOperation* operation = task[@"operation"];
     [operation cancel];
     task[@"operation"]=nil;
@@ -371,6 +404,9 @@
 }
 -(void) startTask:(NSMutableDictionary*) task
 {
+    if (self.onlyWiFi && self.reach.currentReachabilityStatus != ReachableViaWiFi) {
+        return;
+    }
     /*__block*/ NSMutableDictionary* block_task = task;
     __weak typeof(self) weakSelf = self;
 
@@ -413,4 +449,12 @@
 //  
 //    
 //}
+
+- (BOOL)canUpload {
+    if (self.onlyWiFi && self.reach.currentReachabilityStatus != ReachableViaWiFi) {
+        return NO;
+    }
+    return YES;
+}
+
 @end

+ 26 - 3
common/upload/RAUploadOperation.m

@@ -21,6 +21,7 @@
     BOOL        finished;
     NSMutableDictionary* _taskinfo;
     int _maxRetry;
+    NSURLSessionTask *_urlSessionTask;
 }
 
 @end
@@ -98,7 +99,7 @@
         return;
     }
     
-    [NetworkUtils upload:[self filePath:_taskinfo ]  Params:_taskinfo[@"params"] ToHost:_taskinfo[@"url"] Result:^(NSMutableDictionary *result) {
+    _urlSessionTask = [NetworkUtils upload:[self filePath:_taskinfo ]  Params:_taskinfo[@"params"] ToHost:_taskinfo[@"url"] Result:^(NSMutableDictionary *result) {
         blockDebugLog(@"upload result: %@",result);
         int r=[result[@"result"] intValue];
         if(r==2|| r==RESULT_BARCODE_ERROR)
@@ -111,12 +112,19 @@
         }
         else
         {
-            if([block_task[@"retry"] intValue]>=_maxRetry)
+            BOOL canUpload = [Appdelegate.uploadManager canUpload];
+            DebugLog(@"can upload %@",@(canUpload));
+            if (!canUpload) {
+                block_task[@"status"]=[NSNumber numberWithInt:TaskStatusStop];
+                block_task[@"progress"]=[NSNumber numberWithDouble:0.0];
+                block_task[@"msg"]= @"Can only use wifi to upload";
+                
+            }
+            else if([block_task[@"retry"] intValue]>=_maxRetry)
             {
                 block_task[@"status"]=[NSNumber numberWithInt:TaskStatusError];
                 block_task[@"progress"]=[NSNumber numberWithDouble:0.0];
                 block_task[@"msg"]=result[@"msg"];
-                
             }
             else
             {
@@ -152,6 +160,7 @@
 //            ((UIProgressView*) block_task[@"ui_pregress"]).progress = progress;
             block_task[@"progress"]=[NSNumber numberWithFloat:progress];
 //            NSLog(@"updateUI progress %p",weakself);
+            DebugLog(@"update UI %@",weakself.updateUI);
             if(weakself.updateUI)
             {
 //                NSLog(@"updateUI progress CALL");
@@ -201,4 +210,18 @@
 {
    // dumpThreads(@"dealloc");
 }
+
+- (void)cancel {
+    
+    
+    if (_urlSessionTask.state == NSURLSessionTaskStateRunning || _urlSessionTask.state == NSURLSessionTaskStateSuspended) {
+        DebugLog(@"cancel session task");
+        [_urlSessionTask suspend];
+        [_urlSessionTask cancel];
+    }
+    
+    [super cancel];
+}
+
+
 @end