// // nasDownloadFileManager.m // // // Created by David on 2024/8/5. // #import "nasDownloadFileManager.h" @interface nasDownloadFileManager () @end @implementation nasDownloadFileManager static nasDownloadFileManager * cur_nasDownloadFileManager = nil; +(nasDownloadFileManager *)shareInstance; { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ cur_nasDownloadFileManager = [[nasDownloadFileManager alloc] init]; }); return cur_nasDownloadFileManager; } - (id)init { self = [super init]; if (self) { //[self initManager]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadTaskFinishedNoti:) name:nasDownloadTaskExeEnd object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadTaskFinishedNoti:) name:nasDownloadTaskExeError object:nil]; [self initDownloadManagerFun]; } return self; } - (void)initDownloadManagerFun { [nasDownloadManager shareManager].uid = ksharedAppDelegate.DeviceThirdIdMod.data.sn; [nasDownloadManager shareManager].maxDownLoadCount = 3; [self delItemInDoneTaskFun]; } - (NSMutableArray*)downLoadFileModelDataArr { if(_databaseArr && _databaseArr.count >=3){ return _databaseArr[0]; } return [NSMutableArray new]; } #pragma mark 删除已经完成和删除文件的任务 - (void)delItemInDoneTaskFun { // NSArray *allDownItemArr = [YCDownloadManager downloadList]; // // for (YCDownloadItem *item in allDownItemArr) { // if (item.downloadStatus == YCDownloadStatusFinished) { // NSString *savePath = item.savePath; // // if (![[NSFileManager defaultManager] fileExistsAtPath:savePath]){ // [YCDownloadManager stopDownloadWithItem:item]; // } // } // } } #pragma mark 删除多余的任务 比如数据删除了 但是任务还在 - (void)checkDownloadTaskFun{ } //添加保存记录 - (void)addNasDownloadRecordFunBy:(NSArray*)arr complete:(custom_complete_Arr)complete{ KWeakSelf if(arr && arr.count >0 ){ //1.排重处理 [self getDataInDatabaseFun:NO complete:^(NSMutableArray * _Nonnull Arr) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ [weakSelf filterDownloadingTaskFunWithNewTaskArr:arr complete:complete]; }); }]; } } - (void)filterDownloadingTaskFunWithNewTaskArr:(NSArray*)taskArr complete:(custom_complete_Arr)complete { NSMutableArray *addTaskArr = [NSMutableArray new]; NSMutableArray * downloadingArr = [NSMutableArray new]; if(_databaseArr && _databaseArr.count == 3){ //downloadingArr = _databaseArr[0]; downloadingArr = [NSMutableArray arrayWithArray:_databaseArr[0]]; } for (couldPhoneFileModel*model in taskArr) { BOOL canAdd = YES; HLog(@"正在遍历下载数组 看是否有任务重复") if(downloadingArr.count > 0){ for (couldPhoneFileModel*downloadingModel in downloadingArr) { if([downloadingModel.fileUrl isEqualToString:model.fileUrl]){ canAdd = NO; break; } } } if(canAdd){ model.bg_tableName = nas_box_download_tableName; [addTaskArr addObject:model]; } } HLog(@"遍历下载数组 看是否有任务重复结束") downloadingArr = nil; if(addTaskArr.count >0){ KWeakSelf //[couldPhoneFileModel bg_saveOrUpdateArray:arr]; [couldPhoneFileModel bg_saveOrUpdateArrayAsync:addTaskArr complete:^(BOOL isSuccess) { //保存完成重新读取数据库 这样下载中的任务才会完整 [weakSelf getDataInDatabaseFun:YES complete:^(NSMutableArray * _Nonnull Arr) { [weakSelf beginDownloadFilesByUrls:addTaskArr]; complete(weakSelf.databaseArr); }]; }]; } else{//任务下载中 complete(_databaseArr); } } #pragma mark 读取数据库数据 - (void)getDataInDatabaseFun:(BOOL)isReGet complete:(custom_complete_Arr)complete { if(_databaseArr && _databaseArr.count == 3 && !isReGet){ complete(_databaseArr); return; } if(!_databaseArr) { _databaseArr = [NSMutableArray new]; } //KWeakSelf dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ [couldPhoneFileModel bg_findAsync:nas_box_download_tableName limit:0 orderBy:nil desc:YES complete:^(NSArray * _Nullable array) { NSMutableArray *failArr = [NSMutableArray new]; NSMutableArray *doneArr = [NSMutableArray new]; NSMutableArray *otherArr = [NSMutableArray new]; if(array && array.count >0){ for (couldPhoneFileModel * curModel in array) { if(curModel.curDownloadStateType == downloadStateFail){ [failArr addObject:curModel]; } else if(curModel.curDownloadStateType == downloadStateDone){ [doneArr addObject:curModel]; } else{ [otherArr addObject:curModel]; } } } @synchronized (self) { NSMutableArray *newArr = [NSMutableArray new]; [newArr addObject:otherArr]; [newArr addObject:doneArr]; [newArr addObject:failArr]; self->_databaseArr = newArr; if(isReGet){ [self checkDownloadTaskFun]; } complete(self->_databaseArr); } }]; }); } - (void)handleDatabaseArrByDelete:(couldPhoneFileModel*)delModel { if(_databaseArr && _databaseArr.count == 3 ){ if(delModel.curDownloadStateType == downloadStateDone) { NSMutableArray *arr = _databaseArr[1]; [self deteleModel:delModel inArr:arr]; } else if(delModel.curDownloadStateType == downloadStateFail){ NSMutableArray *arr = _databaseArr[2]; [self deteleModel:delModel inArr:arr]; } else{ NSMutableArray *arr = _databaseArr[0]; [self deteleModel:delModel inArr:arr]; } } } #pragma mark 处理删除内存数据 - (void)deteleModel:(couldPhoneFileModel*)delModel inArr:(NSMutableArray*)delArr{ HLog(@"%ld -删除某个指定的下载对象 %@",delArr.count, delModel.name) if (delArr.count > 0) { [delArr removeObject:delModel]; } // for (couldPhoneFileModel *dataModel in delArr) { // if(delModel.bg_id.integerValue == dataModel.bg_id.integerValue){ // HLog(@"正在遍历下载的 数组 并且删除某个数据") // [delArr removeObject:dataModel]; // break; // } // } } #pragma mark 删除本地数据库记录 - (void)deleteBoxSaveFileRecordBy:(NSMutableArray *)delArr{ NSMutableArray *curDelArr = [NSMutableArray arrayWithArray:delArr]; for (couldPhoneFileModel *dataModel in curDelArr) { //1.内存数据删除 [self handleDatabaseArrByDelete:dataModel]; //2.删除数据量 NSMutableString* where = [[NSMutableString alloc] initWithString:@"where "]; NSString *curStr = [NSString stringWithFormat:@"%@=%@ ",bg_sqlKey(@"bg_id"),bg_sqlValue(dataModel.bg_id)]; [where appendString:curStr]; [couldPhoneFileModel bg_deleteAsync:nas_box_download_tableName where:where complete:^(BOOL isSuccess) { if(isSuccess){ } }]; if(dataModel.curDownloadStateType == downloadStateWait || dataModel.curDownloadStateType == downloadStateUploading){ //3.取消下载 NSString *urlString = dataModel.fileUrl; NSString *requestURLEncodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[nasDownloadManager shareManager] deleteDownloadWithUrl:requestURLEncodedString]; } } } - (void)deleteDownloadFileRecordBy:(NSMutableArray *)delArr withDelCache:(BOOL)isDelCache { [self deleteBoxSaveFileRecordBy:delArr]; [[NSNotificationCenter defaultCenter] postNotificationName:downloadFileRefreshNotification object:nil]; } #pragma mark 删除本地数据库记录 - (void)deleteDownloadFileRecordBy:(NSMutableArray *)delArr withDelCache:(BOOL)isDelCache withAll:(BOOL)isAllType { if(isAllType){ [[nasDownloadManager shareManager] suspendAllDownloadTask]; } [self deleteDownloadFileRecordBy:delArr withDelCache:isAllType]; } #pragma mark 更新本地数据库记录 - (void)updataBoxSaveDataInFailBy:(couldPhoneFileModel*)dataModel { //1.修改数据库 if(_databaseArr.count == 3){ NSMutableArray *failArr = _databaseArr[2]; NSMutableArray *ingArr = _databaseArr[0]; for (couldPhoneFileModel* model in failArr) { if (dataModel.bg_id.integerValue == model.bg_id.integerValue) { HLog(@"正在遍历下载失败数组 并且删除某个数据") [failArr removeObject:model]; [ingArr addObject:dataModel]; break; } } } [dataModel bg_saveOrUpdateAsync:^(BOOL isSuccess) { }]; } #pragma mark 开始下载文件 - (void)beginDownloadFilesByUrls:(NSArray *)urlArr{ // NSMutableArray*arr = [[SGDownloadManager shareManager] getAllOperation]; // if(arr && arr.count > 0){ // HLog(@"有任务正在下载"); // [[SGDownloadManager shareManager] startAllDownloadTask]; // return; // } if(urlArr && urlArr.count > 0){ NSMutableArray *URLEncodedStringArr = [NSMutableArray new]; for (NSInteger i= urlArr.count-1; i>=0; i--) { couldPhoneFileModel *fileModel = urlArr[i]; NSString *urlString = fileModel.fileUrl; NSString *requestURLEncodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // [[mixDownloadManager shareManager] downloadWithURL:[NSURL URLWithString:requestURLEncodedString] complete:^(NSDictionary * _Nonnull respose, NSError * _Nonnull error) { // HLog(@"download:%@",respose); // }]; [URLEncodedStringArr addObject:requestURLEncodedString]; } BOOL isCanUseCellular = [HWDataManager getBoolWithKey:stringKeyAddSn(Const_file_Transfe_canUse_Cellular_all)]; if(!isCanUseCellular){//不允许流量上传 // if([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN){ mainBlock(^{ [[iToast makeText:NSLocalizedString(@"File_Transfer_By_Cellular_tip",nil)] show]; }); [self saveDownloadloadingTaskByNetWorkErrorFun]; return; } } [[nasDownloadManager shareManager] addDownloadWithURLs:URLEncodedStringArr]; } } #pragma mark 下载完成 - (void)downloadTaskFinishedNoti:(NSNotification *)notification { HLog(@"downloadTaskFinishedNoti") customDownloadOperation *model = notification.userInfo.allValues.firstObject; if(!model)return; //globalBlock(^{ if (model.downloadState == customDownloadStateCompleted) { //1.先做数据保存 NSDictionary *dataDict = [model downLoadInfoWithFinished:YES]; [self saveFileInfoWithDict:dataDict with:model.url]; [self handldDownloadDoneDataBy:model]; HLog(@"handldDownloadDoneDataBy done") } else if (model.downloadState == customDownloadStateFailed){ [self handldDownloadFailDataBy:model]; } mainBlock(^{ [[NSNotificationCenter defaultCenter] postNotificationName:nasDownloadTaskFinishedNotification object:model]; [[webRtcManager shareManager] NasDownloadTaskFinishedNoti:model]; }); // }); } #pragma mark 下载完成数据回调处理 - (void)handldDownloadDoneDataBy:(customDownloadOperation*)model { //解码 NSString * urlString = [model.url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; if(_databaseArr && _databaseArr.count == 3 ){ HLog(@"正在遍历下载完成数组 开始 %@",model.fileName) NSMutableArray *ingArr0 = _databaseArr[0]; NSMutableArray *ingArr = [NSMutableArray arrayWithArray:_databaseArr[0]]; couldPhoneFileModel*curDataModel = nil; for (couldPhoneFileModel*dataModel in ingArr) { //HLog(@"22222222 %@\n%@",urlString,dataModel.fileUrl); if([urlString isEqualToString:dataModel.fileUrl]){ // dataModel.curDownloadStateType = downloadStateDone; // HLog(@"正在遍历下载完成数组 并且添加 %@",dataModel.name) // NSMutableArray *doneArr = _databaseArr[1]; // [doneArr insertObject:dataModel atIndex:0]; // // //更新数据库 // [dataModel bg_saveOrUpdateAsync:^(BOOL isSuccess) { // // }]; curDataModel = dataModel; //[self deteleModel:dataModel inArr:ingArr]; break; } } HLog(@"正在遍历下载完成数组 结束") if(curDataModel){ curDataModel.curDownloadStateType = downloadStateDone; HLog(@"正在遍历下载完成数组 并且添加 %@",curDataModel.name) NSMutableArray *doneArr = _databaseArr[1]; [doneArr insertObject:curDataModel atIndex:0]; HLog(@"开始删除某个指定的下载对象 %@",curDataModel.name) [ingArr0 removeObject:curDataModel]; HLog(@"完成删除某个指定的下载对象 %@",curDataModel.name) //更新数据库 // [curDataModel bg_saveOrUpdateAsync:^(BOOL isSuccess) { // HLog(@"33333") // }]; [curDataModel bg_saveOrUpdate]; HLog(@"44444") } } } #pragma mark 下载失败数据回调处理 - (void)handldDownloadFailDataBy:(customDownloadOperation*)model { //解码 NSString * urlString = [model.url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; if(_databaseArr && _databaseArr.count == 3 ){ NSMutableArray *ingArr0 = _databaseArr[0]; NSMutableArray *ingArr = [NSMutableArray arrayWithArray:_databaseArr[0]]; HLog(@"ingArr --%ld",ingArr.count) for (couldPhoneFileModel*dataModel in ingArr) { HLog(@"22222222 %@\n%@",urlString,dataModel.fileUrl); if([urlString isEqualToString:dataModel.fileUrl]){ dataModel.curDownloadStateType = downloadStateFail; dataModel.failMsg = NSLocalizedString(@"File_download_error_404",nil); HLog(@"正在遍历下载失败数组 并且删除某个数据") //失败里面添加 NSMutableArray *failArr = _databaseArr[2]; [failArr insertObject:dataModel atIndex:0]; //更新数据库 [dataModel bg_saveOrUpdateAsync:^(BOOL isSuccess) { }]; [self deteleModel:dataModel inArr:ingArr0]; break; } } } } #pragma mark 全部暂停 或者暂停某一个 - (void)suspendDownloadFileFun:(BOOL)isSuspendAll withModel:(couldPhoneFileModel*)dataModel { if(isSuspendAll){//全部暂停 if (_databaseArr && _databaseArr.count == 3) { NSMutableArray *downloadingArr = _databaseArr[0]; for (couldPhoneFileModel*model in downloadingArr) { model.curDownloadStateType = downloadStateSuspend; } if(downloadingArr.count > 0){ [couldPhoneFileModel bg_saveOrUpdateArrayAsync:downloadingArr complete:^(BOOL isSuccess) { }]; } } [[nasDownloadManager shareManager] suspendAllDownloadTask]; //刷新UI mainBlock(^{ [[NSNotificationCenter defaultCenter] postNotificationName:nasDownloadTaskFinishedNotification object:nil]; }); } else if(dataModel){//暂停指定任务 NSString *urlString = dataModel.fileUrl; NSString *requestURLEncodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; HLog(@"%@",urlString); [[nasDownloadManager shareManager] supendDownloadWithUrl:requestURLEncodedString]; //2.修改状态 if (_databaseArr && _databaseArr.count == 3) { NSMutableArray *downloadingArr = _databaseArr[0]; for (couldPhoneFileModel*model in downloadingArr) { if(model.bg_id.integerValue == dataModel.bg_id.integerValue){ model.curDownloadStateType = downloadStateSuspend; break; } } if(downloadingArr.count > 0){ [couldPhoneFileModel bg_saveOrUpdateArrayAsync:downloadingArr complete:^(BOOL isSuccess) { }]; } } } } #pragma mark 重新开始下载 - (void)reDownloadFileFunBy:(NSMutableArray*)arr withAll:(BOOL)isAllType { HLog(@"reDownloadFileFunBy --- %ld",arr.count) KWeakSelf if(isAllType){ if (_databaseArr && _databaseArr.count == 3) { NSMutableArray *downloadingArr = _databaseArr[0]; NSMutableArray *ReverseOrderArr = [NSMutableArray new]; for (NSInteger i = downloadingArr.count -1; i>=0; i--) { couldPhoneFileModel*model = downloadingArr[i]; model.curDownloadStateType = downloadStateUploading; [ReverseOrderArr addObject:model]; } //这里处理重新下载 [weakSelf beginDownloadFilesByUrls:ReverseOrderArr]; if(downloadingArr.count > 0){ [couldPhoneFileModel bg_saveOrUpdateArrayAsync:downloadingArr complete:^(BOOL isSuccess) { }]; } //刷新UI mainBlock(^{ [[NSNotificationCenter defaultCenter] postNotificationName:nasDownloadTaskFinishedNotification object:nil]; }); } } else { NSMutableArray *downloadingArr = arr; NSMutableArray *ReverseOrderArr = [NSMutableArray new]; for (NSInteger i = downloadingArr.count -1; i>=0; i--) { couldPhoneFileModel*model = downloadingArr[i]; model.curDownloadStateType = downloadStateUploading; [ReverseOrderArr addObject:model]; } //这里处理重新下载 [self beginDownloadFilesByUrls:ReverseOrderArr]; if(downloadingArr.count > 0){ [couldPhoneFileModel bg_saveOrUpdateArrayAsync:downloadingArr complete:^(BOOL isSuccess) { }]; } } // { // // couldPhoneFileModel* dataModel = nil; // if(arr && arr.count > 0){ // dataModel = arr.firstObject; // // //修改数据库状态 // dataModel.curDownloadStateType = downloadStateUploading; // [couldPhoneFileModel bg_saveOrUpdateArrayAsync:@[dataModel] complete:^(BOOL isSuccess) { // // }]; // }else{ // return; // } // NSString *urlString = dataModel.fileUrl; // NSString *requestURLEncodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // HLog(@"%@",urlString); // // [[nasDownloadManager shareManager] startDownLoadWithUrl:requestURLEncodedString]; // // } } #pragma mark 重新开始下载 第一次进去传输列表是用 - (void)firstReDownloadAllFileFun { if (_databaseArr && _databaseArr.count == 3) { NSMutableArray *downloadingArr = _databaseArr[0]; NSMutableArray *URLEncodedStringArr = [NSMutableArray new]; for (couldPhoneFileModel*model in downloadingArr) { if(model.curDownloadStateType == downloadStateUploading) { NSString *urlString = model.fileUrl; NSString *requestURLEncodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [URLEncodedStringArr addObject:requestURLEncodedString]; } } if(URLEncodedStringArr.count > 0){ [[nasDownloadManager shareManager] addDownloadWithURLs:URLEncodedStringArr]; } } } #pragma mark 检测是否有任务下载中或者暂停 - (void)checkHadDownloadTaskWithComplete:(custom_complete_B)complete { [self getDataInDatabaseFun:NO complete:^(NSMutableArray * _Nonnull Arr) { mainBlock(^{ if(!Arr || Arr.count != 3){ complete(NO); } else{ NSArray *firstArr = Arr[0]; if(firstArr.count >0){ complete(YES); } else{ complete(NO); } } }); }]; } #pragma mark- download done plist Path - (NSString *)getDownloadDonePlistPath { NSString *fileFolder = [customDownloadCacheManager getFullDirector]; return [fileFolder stringByAppendingPathComponent:@"nasDownloadDoneInfo.plist"];; } #pragma mark- download done plist - (NSMutableDictionary *)getDownloadDownList { if (!_downloadDoneList) { // 内存没有 _downloadDoneList = [[NSDictionary dictionaryWithContentsOfFile:[self getDownloadDonePlistPath]] mutableCopy]; // 本地加载 if (!_downloadDoneList) { // 本地没有,分配内存 _downloadDoneList = [NSMutableDictionary dictionary]; } } return _downloadDoneList; } /** 增加配置信息 */ - (BOOL)saveFileInfoWithDict:(NSDictionary *)dict with:(NSString*)url { HLog(@"saveFileInfoWithDict") if(!dict || !url){ return NO; } BOOL flag = NO; @synchronized (self) { NSString *key = url; NSMutableDictionary *dictM = [self getDownloadDownList]; [dictM setObject:dict forKey:key]; flag = [dictM writeToFile:[self getDownloadDonePlistPath] atomically:YES]; return flag; } } /** 删除配置信息 */ - (BOOL)deleteFileInfoWithUrl:(NSString *)url { if(!url){ return NO; } BOOL flag = NO; @synchronized (self) { NSMutableDictionary *dictM = [self getDownloadDownList]; [dictM removeObjectForKey:url]; flag = [dictM writeToFile:[self getDownloadDonePlistPath] atomically:YES]; } return flag; } #pragma mark-保存完成后 删除此次信息 download done plist - (void)deleteDownloadDonePlistInfoBy:(NSString*)fullPath { HLog(@"deleteDownloadDonePlistInfoBy:%@",fullPath) NSMutableDictionary *dictM = [self getDownloadDownList]; NSDictionary * forDict = [NSDictionary dictionaryWithDictionary:dictM]; for (NSString*key in forDict) { NSDictionary*dict = forDict[key]; if ([[dict allKeys] containsObject:@"fullPath"]) { NSString * infofullPath = dict[@"fullPath"]; if([fullPath isEqualToString:infofullPath]){ [self deleteFileInfoWithUrl:key]; break; } } } } #pragma mark-查询还有没有没处理的任务 - (void)checkDownloadDonePlistInfoFun { HLog(@"checkDownloadDonePlistInfoFun") dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ NSMutableDictionary *dictM = [[self getDownloadDownList] mutableCopy]; NSMutableArray *needDeletekeyArr = [NSMutableArray array]; if(dictM.count > 0){ for (NSString*key in dictM) { NSDictionary*dict = dictM[key]; customDownloadOperation *model = [customDownloadOperation mj_objectWithKeyValues:dict]; NSString*curFullPath = [customDownloadCacheManager getFullPathByOldFullPath:model.fullPath]; //判断文件是否还存在 if (![[NSFileManager defaultManager] fileExistsAtPath:curFullPath]) { //不存在 删除信息 //[self deleteFileInfoWithUrl:key]; [needDeletekeyArr addObject:key]; } else{//存在 通知保存流程 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[webRtcManager shareManager] NasDownloadTaskFinishedNoti:model]; }); break; } } } if(needDeletekeyArr.count > 0){ for(NSString*key in needDeletekeyArr){ //[self deleteFileInfoWithUrl:key]; [dictM removeObjectForKey:key]; } //保存更新本地数据 [dictM writeToFile:[self getDownloadDonePlistPath] atomically:YES]; [needDeletekeyArr removeAllObjects]; } }); } //网络失败后任务暂时保存 - (void)saveDownloadloadingTaskByNetWorkErrorFun { HLog(@"hxd saveDownloadloadingTaskByNetWorkErrorFun") _netWorkFailSaveArr = [NSMutableArray arrayWithArray:self.downLoadFileModelDataArr]; [[nasDownloadManager shareManager] suspendAllDownloadTask]; if(_netWorkFailSaveArr.count > 0){ _needToReDownloadTaskType = YES; } } //重新上传网络失败的任务 - (void)reDownloadloadFileFunByNetWork { _needToReDownloadTaskType = NO; if(_netWorkFailSaveArr && _netWorkFailSaveArr.count >0){ //重新获取url for (couldPhoneFileModel *fileModel in _netWorkFailSaveArr) { fileModel.fileUrl = @""; } //判断是否可以下载 BOOL isCanUseCellular = [HWDataManager getBoolWithKey:stringKeyAddSn(Const_file_Transfe_canUse_Cellular_all)]; if(!isCanUseCellular){//不允许流量下载 // if([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN){ return; } } [self beginDownloadFilesByUrls:_netWorkFailSaveArr]; [_netWorkFailSaveArr removeAllObjects]; } } @end