Browse Source

RA Image

移植上传模块
Ray Zhang 9 years ago
parent
commit
59882aceb6

+ 24 - 0
common/upload/RANetworkTaskDelegate.h

@@ -0,0 +1,24 @@
+//
+//  JKNetworkSessionDelegate.h
+//  Test Upload Progress
+//
+//  Created by Jack on 2017/1/11.
+//  Copyright © 2017年 mini1. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+//#import "JKNetworkResult.h"
+
+typedef void(^resultHandler)(NSMutableDictionary *result);
+typedef void(^progressHandler)(double progress);
+
+
+@interface RANetworkTaskDelegate : NSObject <NSURLSessionDataDelegate>
+
+@property (nonatomic,copy) progressHandler p;
+@property (nonatomic,copy) resultHandler r;
+@property (nonatomic,copy) id(^decryptHandler)(NSString *encryptString);
+
++ (instancetype)sharedInstance;
+
+@end

+ 111 - 0
common/upload/RANetworkTaskDelegate.m

@@ -0,0 +1,111 @@
+//
+//  JKNetworkSessionDelegate.m
+//  Test Upload Progress
+//
+//  Created by Jack on 2017/1/11.
+//  Copyright © 2017年 mini1. All rights reserved.
+//
+
+#import "RANetworkTaskDelegate.h"
+
+@interface RANetworkTaskDelegate ()
+
+@property (nonatomic,strong) NSMutableData *recvData;
+//@property (nonatomic,strong) NSMutableDictionary *result;
+
+@end
+
+@implementation RANetworkTaskDelegate
+
++ (instancetype)sharedInstance {
+    RANetworkTaskDelegate *obj = nil;
+    obj = [[RANetworkTaskDelegate alloc] init];
+    obj.recvData = [NSMutableData data];
+//    obj.result = [[JKNetworkResult alloc] init];
+    return obj;
+}
+
+#pragma mark - NSURLSessionTaskDelegate
+
+- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend {
+    
+    double progress = (double)totalBytesSent / totalBytesExpectedToSend;
+    
+    if (self.p) {
+        self.p(progress);
+    }
+}
+
+- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
+    
+//    if (self.decryptHandler) {
+//        
+//        self.result.decryptHandler = self.decryptHandler;
+//        
+//    }
+//    
+//    if (error) {
+//
+//        self.result.error = error;
+//        
+//        NSLog(@"Delegate recv Error: %@",error.localizedDescription);
+//        
+//    }
+//        
+//    self.result.data = self.recvData;
+//
+//    NSLog(@"Delegate recv data %@",self.recvData);
+//    
+//
+//
+    
+
+
+    if (self.r) {
+        
+        
+        if(self.recvData==nil)
+        {
+            self.r(nil);
+            return;
+            
+        }
+        
+        NSMutableString *str = [[NSMutableString alloc] initWithData:self.recvData encoding:NSUTF8StringEncoding];
+        
+        NSLog(@"data string: %@",str);
+        
+        NSError *error1=nil;
+        NSDictionary *jsobj = [NSJSONSerialization JSONObjectWithData:self.recvData options:NSJSONReadingMutableLeaves error:&error1];
+        if(jsobj==nil)// 服务器返回不是json
+        {
+            
+            jsobj=[NSMutableDictionary new];
+            [jsobj setValue:@"-20" forKey:@"result"];
+            
+        }
+        
+        self.r(jsobj );
+        
+    }
+//
+    [session invalidateAndCancel];
+}
+
+#pragma mark - NSURLSessionDataDelegate
+
+- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
+    
+    NSLog(@"Delegate recv response: %@",response);
+    
+//    self.result.response = response;
+    completionHandler(NSURLSessionResponseAllow);
+    
+}
+
+- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
+    
+    [self.recvData appendData:data];
+}
+
+@end

+ 28 - 0
common/upload/RAUploadManager.h

@@ -0,0 +1,28 @@
+//
+//  RAUploadManager.h
+//  test_autolayout
+//
+//  Created by Ray on 02/05/2017.
+//  Copyright © 2017 USAI. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "RAUploadOperation.h"
+
+@interface RAUploadManager : NSObject
+@property (assign) int maxThread;
+@property (assign) int activeThread;
+@property (assign) int maxRetry;
+
+@property (assign) TaskStatus newtaskStatus;
+@property (strong,nonatomic) NSMutableArray* arr_queue;
+//-(void) upload:(NSString*) url;
+-(void) addTask:(NSMutableDictionary*) task;
+-(void) addTasks:(NSMutableArray*) tasks;
+
+@property (assign) bool removeFinish;
+@property (assign) bool removeError;
+
+@property (strong,nonatomic) NSOperationQueue* operation_queue;
+
+@end

+ 154 - 0
common/upload/RAUploadManager.m

@@ -0,0 +1,154 @@
+//
+//  RAUploadManager.m
+//  test_autolayout
+//
+//  Created by Ray on 02/05/2017.
+//  Copyright © 2017 USAI. All rights reserved.
+//
+#import <UIKit/UIKit.h>
+#import "RAUploadManager.h"
+#import "NetworkUtils.h"
+
+@implementation RAUploadManager
+
+- (instancetype)init {
+    if (self = [super init]) {
+        
+        self.arr_queue = [[NSMutableArray alloc] init];
+        self.newtaskStatus = TaskStatusWait;
+        self.maxThread = 3;
+        self.removeError=true;
+        self.removeFinish = true;
+        
+        self.operation_queue = [NSOperationQueue new];
+        self.operation_queue.maxConcurrentOperationCount = self.maxThread;
+//        self.backgroundColor = [UIColor clearColor];
+    }
+    return self;
+}
+//-(void) upload:(NSString*) url
+//{
+//    while(self.activeThread<self.maxThread)
+//    {
+//        bool nomore=false;
+//        for(int i=0;i<self.arr_queue.count;i++)
+//        {
+//            NSMutableDictionary* task = self.arr_queue[i];
+//            
+//            TaskStatus ts=[task[@"status"] intValue];
+//            if (ts==TaskStatusWait) {
+//                self.activeThread--;
+//                [self uploadTask:task url:url];
+//                break;
+//            }
+//            if(i==self.arr_queue.count-1)
+//                nomore=true;
+//
+//        }
+//        if(nomore)
+//            break;
+//    }
+//}
+-(void) addTask:(NSMutableDictionary*) task
+{
+    
+//    [self.arr_queue addObject:task];
+   
+    
+    if(self.newtaskStatus==TaskStatusWait)
+    {
+        
+        [self startTask:task];
+
+        
+    }
+     [[self mutableArrayValueForKey:@"arr_queue"] addObject:task];
+}
+-(void) addTasks:(NSMutableArray*) tasks
+{
+    
+    if(self.newtaskStatus==TaskStatusWait)
+    {
+        for(NSMutableDictionary* task in tasks)
+            [self startTask:task];
+        
+        
+    }
+    [[self mutableArrayValueForKey:@"arr_queue"] addObjectsFromArray:tasks];
+}
+
+-(void) removeTasks:(NSMutableArray*) tasks
+{
+    
+    
+    for(NSMutableDictionary* task in tasks)
+        [self stopTask:task];
+    [[self mutableArrayValueForKey:@"arr_queue"] removeObjectsInArray:tasks];
+}
+
+-(void) removeTask:(NSMutableDictionary*) task
+{
+    
+    //    [self.arr_queue addObject:task];
+    [self stopTask:task];
+    [[self mutableArrayValueForKey:@"arr_queue"] removeObject:task];
+    
+    
+
+}
+-(void) stopTask:(NSMutableDictionary*) task
+{
+    
+    if([task[@"status"] intValue]!=TaskStatusStart&&[task[@"status"] intValue]!=TaskStatusWait)
+        return; // task 已停止,返回
+    
+    RAUploadOperation* operation = task[@"operation"];
+    [operation cancel];
+    task[@"status"] = [NSNumber numberWithInt:TaskStatusStop] ;
+    task[@"progress"] = [NSNumber numberWithDouble:0.0];
+    
+    
+}
+-(void) startTask:(NSMutableDictionary*) task
+{
+    __block NSMutableDictionary* block_task = task;
+    __weak typeof(self) weakSelf = self;
+
+    if([task[@"status"] intValue]==TaskStatusStart||[task[@"status"] intValue]==TaskStatusWait)
+        return; // task 已在执行队列,返回
+    
+        RAUploadOperation* operation = [[RAUploadOperation alloc] initWithTaskinfo:task retry:self.maxRetry];
+    [operation setCompletionBlock:^{
+        switch ([block_task[@"status"] intValue]) {
+            case TaskStatusFinish:
+            {
+                if(weakSelf.removeFinish)
+                   [self removeTask:block_task];
+            }
+                break;
+            case TaskStatusError:
+            {
+                if(weakSelf.removeError)
+                    [self removeTask:block_task];
+            }
+                break;
+            default:
+                break;
+        }
+        
+    }];
+        task[@"operation"] = operation;
+        task[@"status"] = [NSNumber numberWithInt:self.newtaskStatus] ;
+        [self.operation_queue addOperation:operation];
+    
+        
+}
+//- (void) uploadTask:(NSMutableDictionary*) task url:(NSString*)url{
+//    
+////    __weak typeof(self) weakself = self;
+//    
+//    
+//  
+//    
+//}
+@end

+ 21 - 0
common/upload/RAUploadOperation.h

@@ -0,0 +1,21 @@
+//
+//  RAUploadOperation.h
+//  test_autolayout
+//
+//  Created by Ray on 03/05/2017.
+//  Copyright © 2017 USAI. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+typedef NS_ENUM(NSInteger, TaskStatus) {
+    TaskStatusStop = 0,
+    TaskStatusStart = 1,
+    TaskStatusError = 2,
+    TaskStatusWait = 3,
+    TaskStatusFinish = 4
+};
+@interface RAUploadOperation : NSOperation
+- (instancetype)initWithTaskinfo:(NSMutableDictionary*)taskinfo retry:(int) maxRetry;
+@property (nonatomic , copy) void (^updateUI)();
+//@property (nonatomic , copy) void (^operationFinish)(NSMutableDictionary* taskinfo);
+@end

+ 165 - 0
common/upload/RAUploadOperation.m

@@ -0,0 +1,165 @@
+//
+//  RAUploadOperation.m
+//  test_autolayout
+//
+//  Created by Ray on 03/05/2017.
+//  Copyright © 2017 USAI. All rights reserved.
+//
+
+#import "RAUploadOperation.h"
+#import "NetworkUtils.h"
+#import <UIKit/UIKit.h>
+#import "AppDelegate.h"
+
+@interface RAUploadOperation ()
+{
+//    NSString*   _threadName;
+//    NSString*   _url;
+    BOOL        executing;
+    BOOL        finished;
+    NSMutableDictionary* _taskinfo;
+    int _maxRetry;
+}
+
+@end
+@implementation RAUploadOperation
+
+- (instancetype)initWithTaskinfo:(NSMutableDictionary*)taskinfo retry:(int) maxRetry
+{
+    self = [super init];
+    
+    if (self) {
+//        if (name!=nil)
+//            _threadName = name;
+        _maxRetry = maxRetry;
+//        executing = NO;
+//        finished = NO;
+        _taskinfo=taskinfo;
+        
+    }
+    return self;
+}
+
+- (BOOL)isConcurrent {
+    return YES;
+}
+//
+- (BOOL)isExecuting {
+    return executing;
+}
+
+- (BOOL)isFinished {
+    return finished;
+}
+
+- (void)start
+{
+    
+    [self willChangeValueForKey:@"isExecuting"];
+    executing = true;
+    
+    _taskinfo[@"status"]=[NSNumber numberWithInt:TaskStatusStart];
+    
+    [self didChangeValueForKey:@"isExecuting"];
+    
+    NSLog(@"---------------start--------------------");
+    
+    AppDelegate* Appdelegate=(AppDelegate*)[UIApplication sharedApplication].delegate;
+   
+    
+    
+//    sleep(3);
+//    
+//    [self willChangeValueForKey:@"isFinished"];
+//    finished = true;
+//    [self didChangeValueForKey:@"isFinished"];
+//    
+//
+//    return;
+
+    
+    __weak typeof(self) weakSelf = self;
+    
+    
+    __block NSMutableDictionary* block_task = _taskinfo;
+    
+    [NetworkUtils upload:_taskinfo[@"file_path"]  Params:_taskinfo[@"params"] ToHost:_taskinfo[@"url"] Result:^(NSMutableDictionary *result) {
+        
+        int r=[result[@"result"] intValue];
+        if(r==2)
+        {
+            block_task[@"status"]=[NSNumber numberWithInt:TaskStatusFinish];
+        }
+        else
+        {
+            if([block_task[@"retry"] intValue]>=_maxRetry)
+            {
+                block_task[@"status"]=[NSNumber numberWithInt:TaskStatusError];
+                block_task[@"progress"]=[NSNumber numberWithDouble:0.0];
+                
+            }
+            else
+            {
+                block_task[@"retry"]=[NSNumber numberWithInt:[block_task[@"retry"] intValue]+1];
+                block_task[@"status"]=[NSNumber numberWithInt:TaskStatusWait];
+                block_task[@"progress"]=[NSNumber numberWithDouble:0.0];
+                
+                
+                
+                RAUploadOperation* operation = [[RAUploadOperation alloc] initWithTaskinfo:block_task retry:_maxRetry];
+                operation.updateUI= self.updateUI;
+                block_task[@"operation"] = operation;
+                [Appdelegate.uploadManager.operation_queue addOperation:operation];
+             //   [self upload:url];
+            }
+        }
+        
+        dispatch_async(dispatch_get_main_queue(), ^{
+
+            if(self.updateUI)
+                self.updateUI();
+        });
+        [weakSelf willChangeValueForKey:@"isFinished"];
+        finished = true;
+        [weakSelf didChangeValueForKey:@"isFinished"];
+//        [self completeOperation];
+        
+        
+    } Progress:^(double progress) {
+        
+        dispatch_async(dispatch_get_main_queue(), ^{
+//            ((UIProgressView*) block_task[@"ui_pregress"]).progress = progress;
+            block_task[@"progress"]=[NSNumber numberWithFloat:progress];
+            
+            if(self.updateUI)
+                self.updateUI();
+        });
+        
+    } DecryptHandler:^id(NSString *result) {
+        
+        return @"bibibi";
+        
+    }];
+    
+    //完成下载
+    
+    
+  //  [self didChangeValueForKey:@"isExecuting"];
+}
+
+//- (void)completeOperation {
+////    [self willChangeValueForKey:@"isFinished"];
+////    [self willChangeValueForKey:@"isExecuting"];
+////    
+////    executing = NO;
+////    finished = YES;
+////    
+////    [self didChangeValueForKey:@"isExecuting"];
+////    [self didChangeValueForKey:@"isFinished"];
+//}
+
+- (void)dealloc
+{
+   // dumpThreads(@"dealloc");
+}
+@end