// // RAUploadOperation.m // test_autolayout // // Created by Ray on 03/05/2017. // Copyright © 2017 USAI. All rights reserved. // #import "RAUploadOperation.h" #import "NetworkUtils.h" #import #import "AppDelegate.h" #import "RAUtils.h" #import "const.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; // NSString *md5 = [RAUtils md5WithFile:[self filePath:_taskinfo ]]; DebugLog(@"task %@",_taskinfo); NSString* file_path = [self filePath:_taskinfo]; if(file_path==nil) { DebugLog(@"error no file"); block_task[@"status"]=[NSNumber numberWithInt:TaskStatusError]; block_task[@"progress"]=[NSNumber numberWithDouble:0.0]; [self willChangeValueForKey:@"isFinished"]; finished = true; [self didChangeValueForKey:@"isFinished"]; return; } [NetworkUtils upload:[self filePath:_taskinfo ] Params:_taskinfo[@"params"] ToHost:_taskinfo[@"url"] Result:^(NSMutableDictionary *result) { DebugLog(@"upload result: %@",result); int r=[result[@"result"] intValue]; if(r==2) { block_task[@"status"]=[NSNumber numberWithInt:TaskStatusFinish]; block_task[@"msg"]=@"upload successful"; } else { if([block_task[@"retry"] intValue]>=_maxRetry|| r==RESULT_BARCODE_ERROR) { block_task[@"status"]=[NSNumber numberWithInt:TaskStatusError]; block_task[@"progress"]=[NSNumber numberWithDouble:0.0]; block_task[@"msg"]=[@"error: " stringByAppendingString:result[@"msg"]]; } else { block_task[@"retry"]=[NSNumber numberWithInt:[block_task[@"retry"] intValue]+1]; block_task[@"status"]=[NSNumber numberWithInt:TaskStatusWait]; block_task[@"progress"]=[NSNumber numberWithDouble:0.0]; block_task[@"msg"]=result[@"upload failed, retry..."]; 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"]; } -(NSString*)filePath:(NSMutableDictionary*)task { NSString *path = [RAUtils appCacheDirectory]; path= [path stringByAppendingPathComponent:task[@"path"]]; path= [path stringByAppendingPathComponent:task[@"file"]]; NSFileManager* fmanager = [NSFileManager new]; bool file_exist=[fmanager fileExistsAtPath:path]; if(!file_exist) return nil; return path; } //- (void)completeOperation { //// [self willChangeValueForKey:@"isFinished"]; //// [self willChangeValueForKey:@"isExecuting"]; //// //// executing = NO; //// finished = YES; //// //// [self didChangeValueForKey:@"isExecuting"]; //// [self didChangeValueForKey:@"isFinished"]; //} - (void)dealloc { // dumpThreads(@"dealloc"); } @end