CSFileTransListController.m 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. //
  2. // FileTransListController.m
  3. // zhuxun
  4. //
  5. // Created by winsoft on 17/6/22.
  6. //
  7. //
  8. #import "CSFileTransListController.h"
  9. #import "IWNavigationController.h"
  10. #import "CSTabBarController.h"
  11. //#import "NewMessageTransController.h"
  12. #import "CSFileDownUpCell.h"
  13. #import "CloudStorageDB.h"
  14. #import "CloudStorageUploadCenter.h"
  15. #import "CloudStorageDownloadCenter.h"
  16. #import "FileUtils.h"
  17. #import "UIBarButtonItem+Addition.h"
  18. /**
  19. * 单某个文件夹下的文件(夹)操作后(上传下载成功,暂停,开始上传下载),通知上层文件夹更新状态,支持递归
  20. *
  21. * @param selfFileDownUpModels 实际操作的文件
  22. * @param parentFileDownUpModel 当前操作的父文件夹
  23. * @param downUpStatus 实际操作
  24. */
  25. typedef void (^ParentFileResponseSubFilesBlock)(NSArray <CSFileDownUpModel *> *selfFileDownUpModels,CSFileDownUpModel *parentFileDownUpModel, DownUpStatus downUpStatus);
  26. #define KSegmentH 40
  27. @interface CSFileTransListController()<UITableViewDelegate, UITableViewDataSource>
  28. @property (nonatomic , weak) UISegmentedControl *segmentControl;
  29. @property (nonatomic , weak) UITableView *mainTableView;
  30. @property (nonatomic , weak) CSFileExtensionViewForCell *extensionView;
  31. @property (nonatomic , copy) NSString *pid;
  32. //父节点.
  33. @property (nonatomic , strong) CSFileDownUpModel *parentCSFileDownUpModel;
  34. @property (nonatomic , assign) DownUpModel downUpModel;
  35. @property (nonatomic , strong) ParentFileResponseSubFilesBlock parentFileResponseSubFilesBlock;
  36. @property (nonatomic , strong) NSMutableArray *processDataArray;
  37. @property (nonatomic , strong) NSMutableArray *finishDataArray;
  38. @property (nonatomic , strong) NSMutableArray *uploadProcessDataArray;
  39. @property (nonatomic , strong) NSMutableArray *uploadFinishDataArray;
  40. @property (nonatomic , strong) NSMutableArray *downloadProcessDataArray;
  41. @property (nonatomic , strong) NSMutableArray *downloadFinishDataArray;
  42. @property (nonatomic , strong) NSMutableArray *muiltSelectFilesArray;
  43. @end
  44. @implementation CSFileTransListController
  45. - (NSMutableArray *)processDataArray
  46. {
  47. if (self.downUpModel == DownUpModelUp) {
  48. return self.uploadProcessDataArray;
  49. }else return self.downloadProcessDataArray;
  50. }
  51. - (NSMutableArray *)finishDataArray
  52. {
  53. if (self.downUpModel == DownUpModelDown) {
  54. return self.downloadFinishDataArray;
  55. }else return self.uploadFinishDataArray;
  56. }
  57. - (NSMutableArray *)uploadProcessDataArray
  58. {
  59. if (!_uploadProcessDataArray) {
  60. _uploadProcessDataArray = [NSMutableArray array];
  61. }
  62. return _uploadProcessDataArray;
  63. }
  64. - (NSMutableArray *)uploadFinishDataArray
  65. {
  66. if (!_uploadFinishDataArray) {
  67. _uploadFinishDataArray = [NSMutableArray array];
  68. }
  69. return _uploadFinishDataArray;
  70. }
  71. - (NSMutableArray *)downloadProcessDataArray
  72. {
  73. if (!_downloadProcessDataArray) {
  74. _downloadProcessDataArray = [NSMutableArray array];
  75. }
  76. return _downloadProcessDataArray;
  77. }
  78. - (NSMutableArray *)downloadFinishDataArray
  79. {
  80. if (!_downloadFinishDataArray) {
  81. _downloadFinishDataArray = [NSMutableArray array];
  82. }
  83. return _downloadFinishDataArray;
  84. }
  85. - (NSMutableArray *)muiltSelectFilesArray
  86. {
  87. if (!_muiltSelectFilesArray) {
  88. _muiltSelectFilesArray = [NSMutableArray array];
  89. }
  90. return _muiltSelectFilesArray;
  91. }
  92. - (void)viewDidLoad
  93. {
  94. [super viewDidLoad];
  95. if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
  96. {
  97. self.edgesForExtendedLayout = UIRectEdgeNone;
  98. }
  99. if (!self.pid) {
  100. self.pid = @"0";
  101. }
  102. if ([self.pid isEqualToString:@"0"]) {
  103. self.title = @"传输列表";
  104. }
  105. self.navigationItem.rightBarButtonItem = [UIBarButtonItem itemWithTarget:self action:@selector(muiltSelect) icon:@"navbar_muiltSel" highlightedIcon:@"navbar_muiltSel_press" title:nil iconSize:CGSizeMake(20, 20) fontSize:0 titleColor:nil];
  106. [self initSubviews];
  107. //待取消.使用reload并判断文件状态,是否需要移动.
  108. [self initData];
  109. }
  110. - (void)viewWillAppear:(BOOL)animated
  111. {
  112. [super viewWillAppear:animated];
  113. //需要重新注册进度block
  114. [self.mainTableView reloadData];
  115. [self registeUploadCenter];
  116. [self registeDownloadCenter];
  117. if ([self.pid isEqualToString:@"0"]) {
  118. [self registerFileFolderDownloadNotoice];
  119. }
  120. }
  121. #warning 2017-08-04 bug之.如果退出进入一个未完成的文件夹,则上层进度不会再通知上上层,导致数据不会刷新.
  122. - (void)viewWillDisappear:(BOOL)animated
  123. {
  124. [super viewWillDisappear:animated];
  125. }
  126. - (void)muiltSelect
  127. {
  128. [self.muiltSelectFilesArray removeAllObjects];
  129. self.mainTableView.allowsMultipleSelection = !self.mainTableView.allowsMultipleSelection;
  130. [self.mainTableView reloadData];
  131. __weak typeof(self)weakself = self;
  132. __weak typeof(self.mainTableView)weakTableView = self.mainTableView;
  133. if (self.mainTableView.allowsMultipleSelection) {
  134. CSFileExtensionViewForCell *extensionView = [[CSFileExtensionViewForCell alloc]initWithItmes:@[@{@"icon":@"file_share_normal",@"title":@"分享",@"opType":@(ExtensionOPShare)},@{@"icon":@"file_delete_normal",@"title":@"删除",@"opType":@(ExtensionOPDelete)}]];
  135. extensionView.extensionOpBlock = ^(ExtensionOP extensionOP, CSFileDownUpFrameModel *csFileDownUpFrameModel){
  136. switch (extensionOP) {
  137. case ExtensionOPDelete:
  138. [weakself deleteFiles:self.muiltSelectFilesArray];
  139. break;
  140. case ExtensionOPShare:
  141. //yidong 文件夹;
  142. [weakself shareFiles:self.muiltSelectFilesArray];
  143. break;
  144. default:
  145. break;
  146. }
  147. };
  148. extensionView.disable = YES;
  149. extensionView.frame = CGRectMake(0, self.view.frame.size.height - FileExtensionViewH, SCREEN_WIDTH, FileExtensionViewH);
  150. [self.view addSubview:extensionView];
  151. self.extensionView = extensionView;
  152. self.segmentControl.enabled = NO;
  153. }else{
  154. [self.extensionView removeFromSuperview];
  155. self.extensionView = nil;
  156. self.segmentControl.enabled = YES;
  157. }
  158. //调整tableview.frame
  159. self.mainTableView.frame = CGRectMake(0, CGRectGetMaxY(self.segmentControl.frame), SCREEN_WIDTH, SCREEN_HEIGHT - self.segmentControl.frame.size.height - NavBarHeight - STATUSBAR_HEIGHT -(self.hidesBottomBarWhenPushed?0:self.tabBarController.tabBar.frame.size.height) -(self.extensionView?self.extensionView.frame.size.height:0));
  160. }
  161. - (void)initSubviews{
  162. NSArray *segtitiles = segtitiles = @[@"下载列表",@"上传列表"];
  163. UISegmentedControl *segmentControl = [[UISegmentedControl alloc]initWithItems:segtitiles];
  164. segmentControl.apportionsSegmentWidthsByContent = NO;
  165. segmentControl.tintColor = [UIColor clearColor];//去掉颜色,现在整个segment都看不见
  166. segmentControl.backgroundColor = [UIColor colorWithRed:0.969 green:0.969 blue:0.961 alpha:1.000];
  167. NSDictionary* selectedTextAttributes = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:14],
  168. NSForegroundColorAttributeName: [UIColor colorWithRed:0.000 green:0.475 blue:1.000 alpha:1.000]};
  169. [segmentControl setTitleTextAttributes:selectedTextAttributes forState:UIControlStateSelected];//设置文字属性
  170. NSDictionary* unselectedTextAttributes = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:14],
  171. NSForegroundColorAttributeName: [UIColor colorWithWhite:0.510 alpha:1.000]};
  172. [segmentControl setTitleTextAttributes:unselectedTextAttributes forState:UIControlStateNormal];
  173. segmentControl.segmentedControlStyle = UISegmentedControlStyleBar;
  174. [segmentControl addTarget:self action:@selector(segmentaction:) forControlEvents:UIControlEventValueChanged];
  175. segmentControl.layer.borderColor = LineForSubLineViewColor.CGColor;
  176. segmentControl.layer.borderWidth = 0.5;
  177. segmentControl.selectedSegmentIndex = 0;
  178. if ([self.pid isEqualToString:@"0"]) {
  179. segmentControl.frame = CGRectMake(0, 0, self.view.frame.size.width, KSegmentH);
  180. }else segmentControl.frame = CGRectZero;
  181. [self.view addSubview:segmentControl];
  182. self.segmentControl = segmentControl;
  183. UITableView *mainTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(segmentControl.frame), self.view.frame.size.width, SCREEN_HEIGHT - segmentControl.frame.size.height - NavBarHeight - STATUSBAR_HEIGHT - (![self.pid isEqualToString:@"0"]?0:self.tabBarController.tabBar.frame.size.height)) style:UITableViewStylePlain];
  184. mainTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  185. mainTableView.delegate = self;
  186. mainTableView.dataSource = self;
  187. mainTableView.tableFooterView = [[UIView alloc]init];
  188. mainTableView.tableFooterView.backgroundColor = [UIColor clearColor];
  189. [self.view addSubview:mainTableView];
  190. self.mainTableView = mainTableView;
  191. }
  192. #warning 2017-06-30 获取doing和waiting的数据,加入center进行任务, pause的手动处理.
  193. - (void)initData
  194. {
  195. [Utils showWaitingToView:self.view];
  196. __weak typeof(self)weakSelf = self;
  197. __weak typeof(self.view)weakView = self.view;
  198. __weak typeof(self.mainTableView)weakTableView = self.mainTableView;
  199. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  200. [weakSelf.downloadProcessDataArray removeAllObjects];
  201. [weakSelf.downloadFinishDataArray removeAllObjects];
  202. [weakSelf.uploadProcessDataArray removeAllObjects];
  203. [weakSelf.uploadFinishDataArray removeAllObjects];
  204. [kCloudStorageDB getSubFileFolderUpSuccessFileWithPid:weakSelf.pid ResultBlock:^(NSArray *result) {
  205. for (CSFileDownUpModel *csFileDownUpModel in result) {
  206. CSFileDownUpFrameModel *frameModel = [[CSFileDownUpFrameModel alloc]initWithCSFileDownUpModel:csFileDownUpModel];
  207. [weakSelf.uploadFinishDataArray addObject:frameModel];
  208. }
  209. }];
  210. [kCloudStorageDB getSubFileFolderUpUnFinishedFileWithPid:weakSelf.pid ResultBlock:^(NSArray *result) {
  211. for (CSFileDownUpModel *csFileDownUpModel in result) {
  212. CSFileDownUpFrameModel *frameModel = [[CSFileDownUpFrameModel alloc]initWithCSFileDownUpModel:csFileDownUpModel];
  213. [weakSelf.uploadProcessDataArray addObject:frameModel];
  214. }
  215. }];
  216. //下载成功的条件: 符合条件pid的文件,以及文件夹且子文件都成功.
  217. NSLog(@"Finished递归start-ge");
  218. [kCloudStorageDB getSubFileFolderDownSuccessFileWithPid:weakSelf.pid ResultBlock:^(NSArray *result) {
  219. NSLog(@"Finished递归end-ge,result数量%ld",result.count);
  220. for (CSFileDownUpModel *csFileDownUpModel in result) {
  221. CSFileDownUpFrameModel *frameModel = [[CSFileDownUpFrameModel alloc]initWithCSFileDownUpModel:csFileDownUpModel];
  222. [weakSelf.downloadFinishDataArray addObject:frameModel];
  223. }
  224. }];
  225. //文件夹单独放出来进行判断.
  226. NSLog(@"UnFinished递归start-ge");
  227. [kCloudStorageDB getSubFileFolderDownUnFinishedFileWithPid:weakSelf.pid ResultBlock:^(NSArray *result) {
  228. NSLog(@"UnFinished递归end-ge,result数量%ld",result.count);
  229. for (CSFileDownUpModel *csFileDownUpModel in result) {
  230. CSFileDownUpFrameModel *frameModel = [[CSFileDownUpFrameModel alloc]initWithCSFileDownUpModel:csFileDownUpModel];
  231. [weakSelf.downloadProcessDataArray addObject:frameModel];
  232. }
  233. //内涵尺寸计算,数据多2000+耗时6s,分批加载.
  234. NSLog(@"多framemode生成效率");
  235. }];
  236. NSLog(@"结束");
  237. dispatch_async(dispatch_get_main_queue(), ^{
  238. [Utils HiddenWaitingToView:weakView];
  239. [weakTableView reloadData];
  240. });
  241. });
  242. }
  243. //间隔一秒种.防止和上一个成功的ui刷新冲突
  244. - (void)registeUploadCenter
  245. {
  246. __weak typeof(self)weakself = self;
  247. __weak typeof(self.mainTableView)weakTableView = self.mainTableView;
  248. //上传暂不考虑文件夹
  249. [CloudStorageUploadCenter sharedInstance].fileUpStatusChangeBlock = ^(CSFileDownUpModel *csFileDownUpModel){
  250. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"csFileDownUpModel.downUpUUID = %@", csFileDownUpModel.downUpUUID]; //过滤条件
  251. // NSMutableArray *tempArray = [NSMutableArray array];
  252. NSArray *filteredArray= [weakself.uploadProcessDataArray filteredArrayUsingPredicate:predicate]; //最终结果filteredArray
  253. if (filteredArray.count) {
  254. CSFileDownUpFrameModel *uploadingFrameModel = filteredArray[0];
  255. uploadingFrameModel.csFileDownUpModel.downUpStatus = csFileDownUpModel.downUpStatus;
  256. if (weakself.downUpModel == DownUpModelUp) {
  257. NSInteger index = [weakself.uploadProcessDataArray indexOfObject:uploadingFrameModel];
  258. dispatch_async(dispatch_get_main_queue(), ^{
  259. [weakTableView reloadData];
  260. // [weakTableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
  261. });
  262. }
  263. }else{
  264. //是否可能不存在需要新增的情况>?
  265. }
  266. };
  267. //cell register ui process block.
  268. }
  269. - (void)registeDownloadCenter
  270. {
  271. //先判断文件是否存在,没有,则判断上层(递归)文件夹是否存在.,或则反过来,判断所有的文件夹是否包含通知过来的文件,有则开始更新该文件夹cell.,同文件不同位置的情况?不管ifelase,都判断?,先文件,再文件夹.
  272. __weak typeof(self)weakself = self;
  273. __weak typeof(self.mainTableView)weakTableView = self.mainTableView;
  274. //文件开始下载的通知
  275. [CloudStorageDownloadCenter sharedInstance].fileDownStatusChangeBlock = ^(CSFileDownUpModel *fileDownUpModel){
  276. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"csFileDownUpModel.downUpUUID = %@", fileDownUpModel.downUpUUID]; //过滤条件
  277. NSArray *filteredArray= [weakself.downloadProcessDataArray filteredArrayUsingPredicate:predicate]; //最终结果filteredArray
  278. if (filteredArray.count) {
  279. CSFileDownUpFrameModel *downloaddingFrameModel = filteredArray[0];
  280. downloaddingFrameModel.csFileDownUpModel.downUpStatus = fileDownUpModel.downUpStatus;
  281. if (weakself.downUpModel == DownUpModelDown) {
  282. NSInteger index = [weakself.downloadProcessDataArray indexOfObject:downloaddingFrameModel];
  283. dispatch_async(dispatch_get_main_queue(), ^{
  284. [weakTableView reloadData];
  285. // [weakTableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
  286. });
  287. }
  288. } else if(!filteredArray.count){
  289. #warning 2017-07-20 同一文件不同位置的.情况是否已考虑?
  290. // //开始文件夹判断.
  291. // //获取当前所有文件夹
  292. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"csFileDownUpModel.isdir = 1"]; //过滤条件
  293. NSArray *filteredArray= [weakself.downloadProcessDataArray filteredArrayUsingPredicate:predicate]; //最终结果filteredArray
  294. for (CSFileDownUpFrameModel *downloaddingFolderFrameModel in filteredArray) {
  295. //md5,name.
  296. //判断是否有同文件.
  297. NSPredicate *subPredicate = [NSPredicate predicateWithFormat:@"md5 = %@ AND name = %@",fileDownUpModel.md5,fileDownUpModel.name]; //过滤条件
  298. NSArray *subfilteredArray= [downloaddingFolderFrameModel.csFileDownUpModel.subFileDownUpModels filteredArrayUsingPredicate:subPredicate]; //最终结果filteredArray
  299. if (subfilteredArray.count) {
  300. //刷新当前文件夹.
  301. downloaddingFolderFrameModel.csFileDownUpModel.downUpStatus = fileDownUpModel.downUpStatus;
  302. if (weakself.downUpModel == DownUpModelDown) {
  303. NSInteger index = [weakself.downloadProcessDataArray indexOfObject:downloaddingFolderFrameModel];
  304. dispatch_async(dispatch_get_main_queue(), ^{
  305. [weakTableView reloadData];
  306. // [weakTableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
  307. });
  308. }
  309. }
  310. }
  311. }
  312. };
  313. }
  314. - (void)registerFileFolderDownloadNotoice
  315. {
  316. __weak typeof(self)weakSelf = self;
  317. __weak typeof(self.mainTableView)weakTableView = self.mainTableView;
  318. //新增文件夹下载
  319. CSTabBarController *tabBarController = (CSTabBarController *)self.tabBarController;
  320. tabBarController.cloudControlerFileDownloadBlock = ^(NSArray *dbModels){
  321. [weakSelf initData];
  322. };
  323. }
  324. - (void)segmentaction:(UISegmentedControl *)setmentController
  325. {
  326. self.downUpModel = (DownUpModel)setmentController.selectedSegmentIndex;
  327. [self.mainTableView reloadData];
  328. }
  329. #pragma mark --
  330. #pragma mark -- tableviewDatasource
  331. - (CSFileDownUpFrameModel *)getTargetDataArrayWithIndexPath:(NSIndexPath *)indexPath
  332. {
  333. NSMutableArray *dataArray = nil;
  334. if (indexPath.section == 0) {
  335. dataArray = self.processDataArray;
  336. }else if(indexPath.section == 1)
  337. {
  338. dataArray = self.finishDataArray;
  339. }
  340. CSFileDownUpFrameModel *frameModel = dataArray[indexPath.row];
  341. return frameModel;
  342. }
  343. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  344. {
  345. return 2;
  346. }
  347. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  348. {
  349. if (section == 0) {
  350. return self.processDataArray.count;
  351. }else if(section == 1)
  352. {
  353. return self.finishDataArray.count;
  354. }
  355. return 0;
  356. }
  357. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  358. {
  359. CSFileDownUpFrameModel *frameModel = [self getTargetDataArrayWithIndexPath:indexPath];
  360. CSFileDownUpCell *csFileDownUpCell = [CSFileDownUpCell fileDownUpCellWithCSFileDownUpFrameModel:frameModel tableView:tableView indexPath:indexPath identifier:CSFileDownUpCellIdentifier opItems:@[@{@"icon":@"file_share_normal",@"title":@"分享",@"opType":@(ExtensionOPShare)},@{@"icon":@"file_delete_normal",@"title":@"删除",@"opType":@(ExtensionOPDelete)}]];
  361. csFileDownUpCell.allowsMultipleSelection = tableView.allowsMultipleSelection;
  362. csFileDownUpCell.csFileDownUpFrameModel = frameModel;
  363. csFileDownUpCell.indexPath = indexPath;
  364. __weak typeof(self.mainTableView)weakTableView = self.mainTableView;
  365. __weak typeof(self)weakself = self;
  366. csFileDownUpCell.extensionSwitchBlock = ^(CSFileDownUpFrameModel *csFileDownUpFrameModel){
  367. NSInteger index = [weakself.finishDataArray indexOfObject:csFileDownUpFrameModel];
  368. NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:1];
  369. csFileDownUpFrameModel.isFileExtensionOP = !csFileDownUpFrameModel.isFileExtensionOP;
  370. [weakTableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
  371. [weakTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:YES];
  372. };
  373. csFileDownUpCell.downUpStatusBlock = ^(CSFileDownUpFrameModel *csFileDownUpFrameModel, DownUpStatus downUpStatus){
  374. csFileDownUpFrameModel.csFileDownUpModel.downUpStatus = downUpStatus;
  375. NSInteger index = [weakself.processDataArray indexOfObject:csFileDownUpFrameModel];
  376. NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
  377. [weakTableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
  378. [weakTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:YES];
  379. //db save
  380. [kCloudStorageDB updateCSDownUpFileStatusWithCSFileDownUpModel:csFileDownUpFrameModel.csFileDownUpModel];
  381. //center notice.
  382. if (!csFileDownUpFrameModel.csFileDownUpModel.isdir) {
  383. if (csFileDownUpFrameModel.csFileDownUpModel.downUpType == DownUpModelUp) {
  384. //
  385. [[CloudStorageUploadCenter sharedInstance]updateOneUploadStatusWithcsfileDownUpModel:csFileDownUpFrameModel.csFileDownUpModel downUpStatus:downUpStatus];
  386. }else if (csFileDownUpFrameModel.csFileDownUpModel.downUpType == DownUpModelDown)
  387. {
  388. [[CloudStorageDownloadCenter sharedInstance]updateOneDownloadStatusWithcsfileDownUpModel:csFileDownUpFrameModel.csFileDownUpModel downUpStatus:downUpStatus];
  389. }
  390. //如果上层文件夹下所有文件都暂停,则上层文件夹状态也为暂停,反之如果文件夹初始暂停,其中某个文件开始,则设置文件夹状态为doing.
  391. if (weakself.parentFileResponseSubFilesBlock) {
  392. weakself.parentFileResponseSubFilesBlock(@[csFileDownUpFrameModel.csFileDownUpModel],weakself.parentCSFileDownUpModel,downUpStatus);
  393. }
  394. }else{
  395. NSMutableArray *tempArray = [NSMutableArray array];
  396. for (CSFileDownUpModel *csFileDownUpModel in csFileDownUpFrameModel.csFileDownUpModel.subFileDownUpModels) {
  397. if (csFileDownUpFrameModel.csFileDownUpModel.downUpType == DownUpModelDown && csFileDownUpModel.downUpStatus != DownUpStatusSuccess) {
  398. csFileDownUpModel.downUpStatus = csFileDownUpFrameModel.csFileDownUpModel.downUpStatus;
  399. if (!csFileDownUpModel.isdir && (csFileDownUpModel.downUpStatus != DownUpStatusSuccess )) {
  400. [tempArray addObject:csFileDownUpModel];
  401. }
  402. //内层所有文件夹暂停下载,则外层文件夹也需要暂停.
  403. }
  404. }
  405. [[CloudStorageDownloadCenter sharedInstance]updateDownloadStatusWithcsfileDownUpModels:tempArray downUpStatus:downUpStatus];
  406. if (weakself.parentFileResponseSubFilesBlock) {
  407. weakself.parentFileResponseSubFilesBlock(tempArray,weakself.parentCSFileDownUpModel,downUpStatus);
  408. }
  409. }
  410. };
  411. csFileDownUpCell.fileDownUpSuccessBlock = ^(CSFileDownUpFrameModel *downUpFrameModel){
  412. NSInteger index = 0;
  413. if (downUpFrameModel.csFileDownUpModel.downUpType == DownUpModelUp) {
  414. index = [weakself.uploadProcessDataArray indexOfObject:downUpFrameModel];
  415. [weakself.uploadProcessDataArray removeObject:downUpFrameModel];
  416. [weakself.uploadFinishDataArray insertObject:downUpFrameModel atIndex:0];
  417. }else{
  418. index = [weakself.downloadProcessDataArray indexOfObject:downUpFrameModel];
  419. [weakself.downloadProcessDataArray removeObject:downUpFrameModel];
  420. [weakself.downloadFinishDataArray insertObject:downUpFrameModel atIndex:0];
  421. }
  422. //or 先next再sucess.
  423. dispatch_async(dispatch_get_main_queue(), ^{
  424. if (downUpFrameModel.csFileDownUpModel.downUpType == weakself.downUpModel) {
  425. [weakTableView reloadData];
  426. }
  427. });
  428. #warning 2017-08-04
  429. //等到文件夹成功不可取.(需每个成功,时时更新,解决方案:控制器block,(另开方法)注册down/up,center,每个success的block回调,遍历isdir/md5 file 进行判断.)
  430. if (weakself.parentFileResponseSubFilesBlock) {
  431. weakself.parentFileResponseSubFilesBlock(!downUpFrameModel.csFileDownUpModel.isdir?@[downUpFrameModel.csFileDownUpModel]:downUpFrameModel.csFileDownUpModel.subFileDownUpModels ,weakself.parentCSFileDownUpModel,DownUpStatusSuccess);
  432. }
  433. };
  434. //
  435. csFileDownUpCell.extensionOpBlock = ^(ExtensionOP extensionOP, CSFileDownUpFrameModel *csFileDownUpFrameModel){
  436. switch (extensionOP) {
  437. case ExtensionOPDelete:
  438. [weakself deleteFile:csFileDownUpFrameModel];
  439. break;
  440. case ExtensionOPShare:
  441. [weakself shareFile:csFileDownUpFrameModel];
  442. break;
  443. default:
  444. break;
  445. }
  446. };
  447. return csFileDownUpCell;
  448. }
  449. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
  450. {
  451. switch (self.downUpModel) {
  452. case DownUpModelDown:
  453. if (section == 0) {
  454. return [NSString stringWithFormat:@"正在下载 (%ld)",self.processDataArray.count];
  455. }else if (section == 1){
  456. return [NSString stringWithFormat:@"下载完成 (%ld)",self.finishDataArray.count];
  457. }
  458. break;
  459. case DownUpModelUp:
  460. if (section == 0) {
  461. return [NSString stringWithFormat:@"正在上传 (%ld)",self.processDataArray.count];
  462. }else if (section == 1){
  463. return [NSString stringWithFormat:@"上传完成 (%ld)",self.finishDataArray.count];
  464. }
  465. break;
  466. default:
  467. break;
  468. }
  469. return 0;
  470. }
  471. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
  472. {
  473. if (section == 0) {
  474. return self.processDataArray.count?40:0;
  475. }else return self.finishDataArray.count?40:0;
  476. }
  477. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  478. {
  479. CSFileDownUpFrameModel *frameModel = [self getTargetDataArrayWithIndexPath:indexPath];
  480. return frameModel.cellHeight;
  481. }
  482. #pragma mark --
  483. #pragma mark -- tableViewDelegate
  484. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  485. {
  486. __weak typeof(self)weakSelf = self;
  487. [tableView deselectRowAtIndexPath:indexPath animated:YES];
  488. CSFileDownUpFrameModel *frameModel = [self getTargetDataArrayWithIndexPath:indexPath];
  489. if (!tableView.allowsMultipleSelection) {
  490. if (!frameModel.csFileDownUpModel.isdir) {
  491. if (frameModel.csFileDownUpModel.downUpStatus == DownUpStatusSuccess) {
  492. NSString *fileRouter = nil;
  493. if (frameModel.csFileDownUpModel.fileSouce == FileSourceFileLocal) {
  494. if (frameModel.csFileDownUpModel.fileType == FileTypeImage) {
  495. fileRouter = [NSString stringWithFormat:@"%@/%@",PhotosMessageDir,frameModel.csFileDownUpModel.localRootPath];
  496. }else fileRouter = [NSString stringWithFormat:@"%@/%@",FileFolderFullRouter,frameModel.csFileDownUpModel.localRootPath];
  497. }else fileRouter = [NSString stringWithFormat:@"%@/%@",CloudStorageFullRouter,frameModel.csFileDownUpModel.localRootPath];
  498. [[FileUtils shareFileUtils]filePreViewWithOrigionPath:[NSString stringWithFormat:@"%@",fileRouter] showController:self];
  499. }
  500. }else{
  501. CSFileTransListController *fileTransListControll = [CSFileTransListController new];
  502. fileTransListControll.parentCSFileDownUpModel = frameModel.csFileDownUpModel;
  503. fileTransListControll.pid = frameModel.csFileDownUpModel.sid;
  504. fileTransListControll.downUpModel = frameModel.csFileDownUpModel.downUpType;
  505. fileTransListControll.parentFileResponseSubFilesBlock = ^(NSArray <CSFileDownUpModel *> *selfFileDownUpModels,CSFileDownUpModel *parentFileDownUpModel, DownUpStatus downUpStatus){
  506. [weakSelf subFileOperateWithSubFiles:selfFileDownUpModels parentFolderFileModel:parentFileDownUpModel downUpStutas:downUpStatus];
  507. };
  508. fileTransListControll.title = frameModel.csFileDownUpModel.name;
  509. [self.navigationController pushViewController:fileTransListControll animated:YES];
  510. }
  511. }else{
  512. #warning 2017-07-20 未完成上传的文件不可分享.sid无.待进一步优化.
  513. frameModel.isSelected = !frameModel.isSelected;
  514. if (frameModel.isSelected) {
  515. [self.muiltSelectFilesArray addObject:frameModel];
  516. }else [self.muiltSelectFilesArray removeObject:frameModel];
  517. if (self.muiltSelectFilesArray.count) {
  518. self.extensionView.disable = NO;
  519. }else self.extensionView.disable = YES;
  520. [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
  521. }
  522. }
  523. - (DownUpStatus)judgeFileFolderStatusWithFileFolderModel:(CSFileDownUpModel *)csFileFolderModel
  524. {
  525. NSInteger successNum = 0;
  526. NSInteger faiureNum = 0;
  527. NSInteger doingNum = 0;
  528. NSInteger waitNum = 0;
  529. NSInteger pauseNum = 0;
  530. //暂停条件,不存在doing和wating下,只有pause和success,faiure.
  531. DownUpStatus fileFolderStatus = DownUpStatusSuccess;
  532. NSArray *tempArray = csFileFolderModel.subFileDownUpModels;
  533. for (CSFileDownUpModel *csFileDownUpModel in tempArray) {
  534. if (csFileDownUpModel.downUpStatus == DownUpStatusSuccess) {
  535. successNum ++;
  536. }else if (csFileDownUpModel.downUpStatus == DownUpStatusFailure)
  537. {
  538. faiureNum ++;
  539. }else if (csFileDownUpModel.downUpStatus == DownUpStatusDoing)
  540. {
  541. doingNum ++;
  542. }else if (csFileDownUpModel.downUpStatus == DownUpStatusWait)
  543. {
  544. waitNum ++;
  545. }else if (csFileDownUpModel.downUpStatus == DownUpStatusPause)
  546. {
  547. pauseNum ++;
  548. }
  549. }
  550. if (successNum == tempArray.count) {
  551. fileFolderStatus = DownUpStatusSuccess;
  552. }else if (faiureNum == tempArray.count)
  553. {
  554. fileFolderStatus = DownUpStatusFailure;
  555. }else if (pauseNum && !doingNum && ! waitNum)
  556. {
  557. fileFolderStatus = DownUpStatusPause;
  558. }else if (waitNum == tempArray.count)
  559. {
  560. fileFolderStatus = DownUpStatusWait;
  561. }else fileFolderStatus = DownUpStatusDoing;
  562. return fileFolderStatus;
  563. }
  564. #pragma mark --
  565. #pragma mark -- celOp汇总
  566. - (void)deleteFiles:(NSArray<CSFileDownUpFrameModel*> *)files
  567. {
  568. //下载同时删除本地文件.多数据同一文件的情况--,不同pid,同name和Md5文件
  569. //上传只删除数据库.
  570. __block NSMutableArray *tempArray = [NSMutableArray array];
  571. [files enumerateObjectsUsingBlock:^(CSFileDownUpFrameModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  572. [tempArray addObject:obj.csFileDownUpModel];
  573. }];
  574. __weak typeof(self)weakself = self;
  575. [kCloudStorageDB deleteCSDownUpFiles:tempArray downUpType:self.downUpModel ResultBlock:^(NSArray *files) {
  576. //取消任务.
  577. if (weakself.downUpModel == DownUpModelDown) {
  578. [[CloudStorageDownloadCenter sharedInstance]updateDownloadStatusWithcsfileDownUpModels:files downUpStatus:DownUpStatusDelete];
  579. }else{
  580. [[CloudStorageUploadCenter sharedInstance]updateUploadStatusWithcsfileDownUpModels:files downUpStatus:DownUpStatusDelete];
  581. }
  582. //如果一个md5和name相同的数据库只有1个,则删除文件,否则只删除文件.
  583. for(CSFileDownUpModel *csFileDownUpModel in files) {
  584. if (!csFileDownUpModel.isdir && csFileDownUpModel.fileSouce == FileSourceCSCloud) {
  585. NSError *error = nil;
  586. [[NSFileManager defaultManager]removeItemAtPath:[NSString stringWithFormat:@"%@/%@",CloudStorageFullRouter,csFileDownUpModel.localRootPath] error:&error];
  587. }
  588. }
  589. }];
  590. [self.finishDataArray removeObjectsInArray:files];
  591. [self.processDataArray removeObjectsInArray:files];
  592. [self.mainTableView reloadData];
  593. if (self.muiltSelectFilesArray.count) {
  594. [self.muiltSelectFilesArray removeAllObjects];
  595. self.extensionView.disable = YES;
  596. }
  597. }
  598. - (void)deleteFile:(CSFileDownUpFrameModel *)file
  599. {
  600. [self deleteFiles:@[file]];
  601. }
  602. - (void)shareFiles:(NSArray<CSFileDownUpFrameModel*> *)files
  603. {
  604. // __block NSMutableArray *tempArray = [NSMutableArray array];
  605. //
  606. // [files enumerateObjectsUsingBlock:^(CSFileDownUpFrameModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  607. // [tempArray addObject:obj.csFileDownUpModel];
  608. // }];
  609. //
  610. // NewMessageTransController *tanrsController = [NewMessageTransController new];
  611. // tanrsController.csfilesArray = tempArray;
  612. // tanrsController.isDisableMulitselect = YES;
  613. // IWNavigationController *navCor = [[IWNavigationController alloc]initWithRootViewController:tanrsController];
  614. //
  615. // [self.navigationController presentViewController:navCor animated:YES completion:nil];
  616. }
  617. - (void)shareFile:(CSFileDownUpFrameModel *)file
  618. {
  619. [self shareFiles:@[file]];
  620. }
  621. /**
  622. * 对父文件夹进行操作,含递归.
  623. */
  624. - (void)subFileOperateWithSubFiles:(NSArray *)subFiles parentFolderFileModel:(CSFileDownUpModel *)parentFileDownUpModel downUpStutas:(DownUpStatus)downUpStatus
  625. {
  626. __weak typeof(self)weakSelf = self;
  627. //先修改文件夹状态.
  628. NSArray *targetFileFolder = [weakSelf.downloadProcessDataArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"csFileDownUpModel.downUpUUID = %@",parentFileDownUpModel.downUpUUID]];
  629. //暂时不考虑同级下的文件
  630. // NSArray *targetSameFiles = [weakSelf.downloadProcessDataArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"csFileDownUpModel.md5 = %@ and csFileDownUpModel.name = %@",selfFileDownUpModel.md5,selfFileDownUpModel.name]];//获取取消父节点?for递归文件夹subfiles及文件.
  631. if (targetFileFolder.count) {
  632. CSFileDownUpFrameModel *folerFileDownUpFrameModel = targetFileFolder[0];
  633. for (CSFileDownUpModel *subCsFileDownUpModel in subFiles) {
  634. NSArray *targetParentFolderFiles = [folerFileDownUpFrameModel.csFileDownUpModel.subFileDownUpModels filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"md5 = %@ and name = %@",subCsFileDownUpModel.md5,subCsFileDownUpModel.name]];
  635. for (CSFileDownUpModel *currentSubFiles in targetParentFolderFiles) {
  636. currentSubFiles.downUpStatus = downUpStatus;
  637. currentSubFiles.downUpSize = subCsFileDownUpModel.downUpSize;
  638. }
  639. }
  640. DownUpStatus newFolderStatus = [weakSelf judgeFileFolderStatusWithFileFolderModel:folerFileDownUpFrameModel.csFileDownUpModel];
  641. if (newFolderStatus != folerFileDownUpFrameModel.csFileDownUpModel.downUpStatus) {
  642. folerFileDownUpFrameModel.csFileDownUpModel.downUpStatus = newFolderStatus;
  643. if (newFolderStatus == DownUpStatusSuccess) {
  644. [weakSelf.downloadProcessDataArray removeObject:folerFileDownUpFrameModel];
  645. [weakSelf.downloadFinishDataArray insertObject:folerFileDownUpFrameModel atIndex:0];
  646. }
  647. }
  648. }
  649. //递归.
  650. if (weakSelf.parentFileResponseSubFilesBlock) {
  651. weakSelf.parentFileResponseSubFilesBlock(subFiles,weakSelf.parentCSFileDownUpModel,downUpStatus);
  652. }
  653. }
  654. - (void)dealloc
  655. {
  656. }
  657. @end