2017-08-11 37 views
0

我的應用程序需要下載許多文件,我使用for循環來創建下載任務。以下方法是AFNetworking提供的方法。AFNetworking/NSURLSession需要很長時間來創建超過100個任務來下載文件

- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request 
             progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock 
             destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination 
           completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler{ 
__block NSURLSessionDownloadTask *downloadTask = nil; 
url_session_manager_create_task_safely(^{ 
    downloadTask = [self.session downloadTaskWithRequest:request]; 
}); 

[self addDelegateForDownloadTask:downloadTask progress:downloadProgressBlock destination:destination completionHandler:completionHandler]; 

return downloadTask; 

}

我的代碼是這樣的:

for (NSInteger i = 0; i<= 500; i++) { 
    NSMutableURLRequest *request = array[i]; 

    NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:downloadProgress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { 
     return destinationPath; 
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { 
     completionBlock(filePath,error); 
    }]; 

    [downloadTask resume]; 
} 

問題是

downloadTask = [self.session downloadTaskWithRequest:request]; 

此行花費比較長的時間完成,這意味着如果EXCUTE它500次,需要5〜6秒。

我的應用程序彈出一個alertView來詢問用戶是否下載,如果他們點擊Yes,它會執行類似for循環的操作,結果UI將卡住5到6秒直到所有任務都完成創建。

我不確定我是否正確或是否有其他方法可以批量下載。 任何人都可以幫助我嗎?謝謝。

回答

1

你應該在不同的線程下運行(在後臺運行)。這樣,用戶將繼續順利使用該應用程序。嘗試下面的代碼:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second... 
    //do your download here 
} 

希望這有助於!

+0

我可以使用GCD做這件事? – user2053760

+0

cgd是什麼意思? –

0

我建議你過渡到AFHTTPSessionManager,它使用NSURLSession。舊的AFHTTPRequestOperationManager基於NSURLConnection,但現在不推薦使用NSURLConnection。事實上,AFNetworking 3.0已完全退役AFHTTPRequestOperationManager

所以,AFHTTPSessionManager下載方法可能是:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 

for (NSInteger i = 0; i < urlArray.count; i++) { 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlArray[i]]]; 
    NSURLSessionTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress *downloadProgress) { 
     [self.delegate downloadProgression:downloadProgress.fractionCompleted * 100.0]; 
    } destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 
     return [NSURL fileURLWithPath:[self.documentDirectory getDownloadContentPath:contentPaths[i]]]; 
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 
     NSLog(@"File downloaded to: %@", filePath); 
     NSLog(@"Error: %@" error.localizedDescription); 
    }]; 
    [task resume]; 
} 
+0

這正是我現在使用的。問題是NSURLSessionTask * task = [manager downloadTaskWithRequest:請求這需要很長時間來創建任務,並且如果循環非常大,比如說500次,這將會很長。 – user2053760

相關問題