瀏覽代碼

VLCDownloadViewController: Refactor trigger next download

Soomin Lee 7 年之前
父節點
當前提交
9a883e3753
共有 1 個文件被更改,包括 94 次插入83 次删除
  1. 94 83
      Sources/VLCDownloadViewController.m

+ 94 - 83
Sources/VLCDownloadViewController.m

@@ -19,13 +19,16 @@
 #import "NSString+SupportedMedia.h"
 #import "VLCHTTPFileDownloader.h"
 
-#define kVLCDownloadViaHTTP 1
-#define kVLCDownloadViaFTP 2
+typedef NS_ENUM(NSUInteger, VLCDownloadScheme) {
+    VLCDownloadSchemeNone,
+    VLCDownloadSchemeHTTP,
+    VLCDownloadSchemeFTP
+};
 
 @interface VLCDownloadViewController () <WRRequestDelegate, UITableViewDataSource, UITableViewDelegate, VLCHTTPFileDownloader, UITextFieldDelegate>
 {
     NSMutableArray *_currentDownloads;
-    NSUInteger _currentDownloadType;
+    VLCDownloadScheme _currentDownloadType;
     NSString *_humanReadableFilename;
     NSMutableArray *_currentDownloadFilename;
     NSTimeInterval _startDL;
@@ -136,102 +139,110 @@
 
 - (void)_updateUI
 {
-    if (_currentDownloadType != 0)
-        [self downloadStarted];
-    else
-        [self downloadEnded];
-
+    _currentDownloadType != VLCDownloadSchemeNone ? [self downloadStarted] : [self downloadEnded];
     [self.downloadsTable reloadData];
 }
 
-#pragma mark - download management
-- (void)_triggerNextDownload
+- (VLCHTTPFileDownloader *)httpDownloader
 {
-    BOOL downloadWasStarted = NO;
-
-    if ([_currentDownloads count] > 0) {
-        [self.activityIndicator startAnimating];
-        NSString *downloadScheme = [_currentDownloads.firstObject scheme];
-        if ([downloadScheme isEqualToString:@"http"] || [downloadScheme isEqualToString:@"https"]) {
-            if (!_httpDownloader) {
-                _httpDownloader = [[VLCHTTPFileDownloader alloc] init];
-                _httpDownloader.delegate = self;
-            }
-
-            if (!_httpDownloader.downloadInProgress) {
-                _currentDownloadType = kVLCDownloadViaHTTP;
-                if (![_currentDownloadFilename.firstObject isEqualToString:@""]) {
-                    _humanReadableFilename = [[_currentDownloadFilename firstObject] stringByRemovingPercentEncoding];
-                    [_httpDownloader downloadFileFromURL:_currentDownloads.firstObject withFileName:_humanReadableFilename];
-                } else {
-                    [_httpDownloader downloadFileFromURL:_currentDownloads.firstObject];
-                    _humanReadableFilename = _httpDownloader.userReadableDownloadName;
-                }
-
-                [_currentDownloads removeObjectAtIndex:0];
-                [_currentDownloadFilename removeObjectAtIndex:0];
-
-                downloadWasStarted = YES;
-            }
-        } else if ([downloadScheme isEqualToString:@"ftp"]) {
-            if (!_FTPDownloadRequest) {
-                _currentDownloadType = kVLCDownloadViaFTP;
-                [self _downloadFTPFile:_currentDownloads.firstObject];
-                _humanReadableFilename = [_currentDownloads.firstObject lastPathComponent];
-                [_currentDownloads removeObjectAtIndex:0];
-                [_currentDownloadFilename removeObjectAtIndex:0];
-            }
-            downloadWasStarted = YES;
-        } else {
-            APLog(@"Unknown download scheme '%@'", downloadScheme);
-            [_currentDownloads removeObjectAtIndex:0];
-            _currentDownloadType = 0;
-            return;
-        }
+    if (!_httpDownloader) {
+        _httpDownloader = [[VLCHTTPFileDownloader alloc] init];
+        _httpDownloader.delegate = self;
+    }
+    return _httpDownloader;
+}
 
-        if (downloadWasStarted) {
-            if (!_backgroundTaskIdentifier || _backgroundTaskIdentifier == UIBackgroundTaskInvalid) {
-                dispatch_block_t expirationHandler = ^{
-                    APLog(@"Downloads were interrupted after being in background too long, time remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);
-                    [[UIApplication sharedApplication] endBackgroundTask:_backgroundTaskIdentifier];
-                    _backgroundTaskIdentifier = 0;
-                };
-
-                if ([[UIApplication sharedApplication] respondsToSelector:@selector(beginBackgroundTaskWithName:expirationHandler:)]) {
-                    _backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"VLCDownloader" expirationHandler:expirationHandler];
-                } else {
-                    _backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];
-                }
-            }
-        }
+#pragma mark - Download management
+
+- (void)_startDownload
+{
+    [_currentDownloads removeObjectAtIndex:0];
+    [_currentDownloadFilename removeObjectAtIndex:0];
+    [self _beginBackgroundDownload];
+    [self _updateUI];
+}
 
-        [self _updateUI];
+- (void)_downloadSchemeHttp
+{
+    if (self.httpDownloader.downloadInProgress) {
+        return;
+    }
+    _currentDownloadType = VLCDownloadSchemeHTTP;
+    if (![_currentDownloadFilename.firstObject isEqualToString:@""]) {
+        _humanReadableFilename = [[_currentDownloadFilename firstObject] stringByRemovingPercentEncoding];
     } else {
-        _currentDownloadType = 0;
+        [self.httpDownloader downloadFileFromURL:_currentDownloads.firstObject];
+        _humanReadableFilename = self.httpDownloader.userReadableDownloadName;
+    }
+    [self _startDownload];
+}
+
+- (void)_downloadSchemeFtp
+{
+    if (_FTPDownloadRequest) {
+        return;
+    }
+    _currentDownloadType = VLCDownloadSchemeFTP;
+    [self _downloadFTPFile:_currentDownloads.firstObject];
+    _humanReadableFilename = [_currentDownloads.firstObject lastPathComponent];
+    [self _startDownload];
+}
+
+- (void)_beginBackgroundDownload
+{
+    if (!_backgroundTaskIdentifier || _backgroundTaskIdentifier == UIBackgroundTaskInvalid) {
+        dispatch_block_t expirationHandler = ^{
+            APLog(@"Downloads were interrupted after being in background too long, time remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);
+            [[UIApplication sharedApplication] endBackgroundTask:_backgroundTaskIdentifier];
+            _backgroundTaskIdentifier = 0;
+        };
+
+        _backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"VLCDownloader" expirationHandler:expirationHandler];
+        if (_backgroundTaskIdentifier == UIBackgroundTaskInvalid) {
+            APLog(@"Unable to download");
+        }
+    }
+}
+
+- (void)_triggerNextDownload
+{
+    if ([_currentDownloads count] == 0) {
+        _currentDownloadType = VLCDownloadSchemeNone;
 
         if (_backgroundTaskIdentifier && _backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
             [[UIApplication sharedApplication] endBackgroundTask:_backgroundTaskIdentifier];
             _backgroundTaskIdentifier = 0;
         }
+        return;
+    }
+
+    [self.activityIndicator startAnimating];
+    NSString *downloadScheme = [_currentDownloads.firstObject scheme];
+
+    if ([downloadScheme isEqualToString:@"http"] || [downloadScheme isEqualToString:@"https"]) {
+        [self _downloadSchemeHttp];
+    } else if ([downloadScheme isEqualToString:@"ftp"]) {
+        [self _downloadSchemeFtp];
+    } else {
+        APLog(@"Unknown download scheme '%@'", downloadScheme);
+        [_currentDownloads removeObjectAtIndex:0];
+        _currentDownloadType = VLCDownloadSchemeNone;
     }
 }
 
 - (IBAction)cancelDownload:(id)sender
 {
-    if (_currentDownloadType == kVLCDownloadViaHTTP) {
-        if (_httpDownloader.downloadInProgress)
-            [_httpDownloader cancelDownload];
-    } else if (_currentDownloadType == kVLCDownloadViaFTP) {
-        if (_FTPDownloadRequest) {
-            NSURL *target = _FTPDownloadRequest.downloadLocation;
-            [_FTPDownloadRequest destroy];
-            [self requestCompleted:_FTPDownloadRequest];
-
-            /* remove partially downloaded content */
-            NSFileManager *fileManager = [NSFileManager defaultManager];
-            if ([fileManager fileExistsAtPath:target.path])
-                [fileManager removeItemAtPath:target.path error:nil];
-        }
+    if (_currentDownloadType == VLCDownloadSchemeHTTP && self.httpDownloader.downloadInProgress) {
+        [self.httpDownloader cancelDownload];
+    } else if (_currentDownloadType == VLCDownloadSchemeFTP && _FTPDownloadRequest) {
+        NSURL *target = _FTPDownloadRequest.downloadLocation;
+        [_FTPDownloadRequest destroy];
+        [self requestCompleted:_FTPDownloadRequest];
+
+        /* remove partially downloaded content */
+        NSFileManager *fileManager = [NSFileManager defaultManager];
+        if ([fileManager fileExistsAtPath:target.path])
+            [fileManager removeItemAtPath:target.path error:nil];
     }
 }
 
@@ -259,7 +270,7 @@
 - (void)downloadEnded
 {
     [[VLCActivityManager defaultManager] networkActivityStopped];
-    _currentDownloadType = 0;
+    _currentDownloadType = VLCDownloadSchemeNone;
     APLog(@"download ended");
     self.progressContainer.hidden = YES;