RQDownloadModel.m 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. //
  2. // RQDownloadModel.m
  3. // TEST
  4. //
  5. // Created by 张嵘 on 2018/10/22.
  6. // Copyright © 2018 张嵘. All rights reserved.
  7. //
  8. #import "RQDownloadModel.h"
  9. #import "RQDownloadHeader.h"
  10. @implementation RQDownloadModel
  11. - (instancetype)initWithFMResultSet:(FMResultSet *)resultSet {
  12. if (!resultSet) return nil;
  13. _vid = [NSString stringWithFormat:@"%@", [resultSet objectForColumn:@"vid"]];
  14. _subject = [NSString stringWithFormat:@"%@", [resultSet objectForColumn:@"subject"]];
  15. _urlString = [NSString stringWithFormat:@"%@", [resultSet objectForColumn:@"urlString"]];
  16. _title = [NSString stringWithFormat:@"%@", [resultSet objectForColumn:@"title"]];
  17. _imageUrl = [NSString stringWithFormat:@"%@", [resultSet objectForColumn:@"imageUrl"]];
  18. _content = [NSString stringWithFormat:@"%@", [resultSet objectForColumn:@"content"]];
  19. _fileName = [NSString stringWithFormat:@"%@", [resultSet objectForColumn:@"fileName"]];
  20. _resumeData = [resultSet dataForColumn:@"resumeData"];
  21. _fileTotalSize = [[resultSet objectForColumn:@"fileTotalSize"] integerValue];
  22. _fileDownloadSize = [[resultSet objectForColumn:@"fileDownloadSize"] integerValue];
  23. _progress = [[resultSet objectForColumn:@"progress"] floatValue];
  24. _status = [[resultSet objectForColumn:@"status"] integerValue];
  25. _statusText = [NSString stringWithFormat:@"%@", [resultSet objectForColumn:@"statusText"]];
  26. _lastSpeedTime = [[resultSet objectForColumn:@"lastSpeedTime"] integerValue];
  27. _intervalFileSize = [[resultSet objectForColumn:@"intervalFileSize"] integerValue];
  28. _lastStateTime = [[resultSet objectForColumn:@"lastStateTime"] integerValue];
  29. _destinationPath = [NSString stringWithFormat:@"%@",[resultSet objectForColumn:@"destinationPath"]];
  30. return self;
  31. }
  32. - (NSString *)vid {
  33. if (!_vid) {
  34. _vid = [NSString stringWithFormat:@"科目%@-%@--%@",_subject,_videoId,_title];
  35. }
  36. return _vid;
  37. }
  38. - (NSString *)fileName{
  39. if (!_fileName) {
  40. NSTimeInterval timeInterval = [[NSDate date]timeIntervalSince1970];
  41. //解决多个任务同时开始时 文件重名问题
  42. NSString *timeStr = [NSString stringWithFormat:@"%.6f",timeInterval];
  43. timeStr = [timeStr stringByReplacingOccurrencesOfString:@"." withString:@"_"];
  44. _fileName = [NSString stringWithFormat:@"%@--%@",_title? :@"无文件名",timeStr];
  45. }
  46. return _fileName;
  47. }
  48. - (NSString *)destinationPath {
  49. _destinationPath = [[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:self.fileName] stringByAppendingString:self.fileFormat];
  50. return _destinationPath;
  51. }
  52. - (NSString *)fileFormat{
  53. if (!_fileFormat && _urlString) {
  54. NSArray *urlArr = [_urlString componentsSeparatedByString:@"."];
  55. if (urlArr && urlArr.count>1) {
  56. self.fileFormat = [@"." stringByAppendingString:[urlArr lastObject]];
  57. }
  58. }
  59. return _fileFormat;
  60. }
  61. - (void)setProgress:(CGFloat)progress {
  62. if (_progress != progress) {
  63. _progress = progress;
  64. }
  65. if (self.progressChanged) {
  66. self.progressChanged(self);
  67. }
  68. }
  69. - (void)setStatus:(RQDownloadStatus)status {
  70. if (_status != status) {
  71. _status = status;
  72. [self setStatusTextWith:_status];
  73. if (self.statusChanged) {
  74. self.statusChanged(self);
  75. }
  76. }
  77. }
  78. - (void)setUrlString:(NSString *)urlString {
  79. _urlString = urlString;
  80. NSArray *urlArr = [_urlString componentsSeparatedByString:@"."];
  81. if (urlArr && urlArr.count>1) {
  82. self.fileFormat = [@"." stringByAppendingString:[urlArr lastObject]];
  83. }
  84. }
  85. - (void)setStatusTextWith:(RQDownloadStatus)status{
  86. _status = status;
  87. NSLog(@"%@%@==%@",self.fileName,self.fileFormat,self.statusText);
  88. }
  89. - (NSString *)statusText {
  90. switch (self.status) {
  91. case RQDownloadStatus_None: {
  92. return @"未缓存";
  93. }
  94. case RQDownloadStatus_Running: {
  95. return _statusText? : @"正在下载";
  96. }
  97. case RQDownloadStatus_Suspended: {
  98. return @"暂停下载";
  99. }
  100. case RQDownloadStatus_Failed: {
  101. return @"下载失败";
  102. }
  103. case RQDownloadStatus_Cancel: {
  104. return @"取消下载";
  105. }
  106. case RQDownloadStatus_Waiting: {
  107. return @"等待下载";
  108. }
  109. case RQDownloadStatus_Completed: {
  110. return @"下载完成";
  111. }
  112. default: {
  113. return @"未缓存";
  114. }
  115. }
  116. }
  117. + (NSArray *)mj_ignoredCodingPropertyNames {
  118. return @[@"statusChanged",@"progressChanged",@"stream",@"operation"];
  119. }
  120. - (NSUInteger)fileDownloadSize {
  121. // 获取文件下载长度
  122. NSInteger fileDownloadSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:self.destinationPath error:nil][NSFileSize] integerValue];
  123. _fileDownloadSize = fileDownloadSize;
  124. return _fileDownloadSize;
  125. }
  126. - (NSOutputStream *)stream {
  127. if (!_stream) {
  128. _stream = [NSOutputStream outputStreamToFileAtPath:self.destinationPath append:YES];
  129. }
  130. return _stream;
  131. }
  132. - (BOOL)isFinished {
  133. return (self.fileTotalSize == self.fileDownloadSize) && (self.fileTotalSize != 0);
  134. }
  135. @end