2017-08-11 6 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]; 

あり、このラインは500のためにそれをexcute場合を意味し、比較的長い完了するのにかかります回、それは5〜6秒かかります。

私のアプリは、ユーザーにダウンロードするかどうかを尋ねるためにalertViewをポップアップし、はいをタップするとforループのようになり、その結果、UIはすべてのタスクが完了するまで5〜6秒間作成した。

私が正しく行ったか、またはバッチダウンロードを行うための他の方法があるかどうかはわかりません。 誰でも助けてくれますか?ありがとうございました。

答えて

1

別のスレッドでダウンロードしてください(バックグラウンドで実行してください)。そうすれば、ユーザーはスムーズにアプリを使い続けることができます。次のコードを試してください:

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

+0

? – user2053760

+0

cgdとはどういう意味ですか? –

0

NSURLSessionを使用するAFHTTPSessionManagerに移行することをお勧めします。古いAFHTTPRequestOperationManagerNSURLConnectionでしたが、現在はNSURLConnectionが推奨されていません。そして実際、AFNetworking 3.0は完全にAFHTTPRequestOperationManagerを引退しました。

ので、AFHTTPSessionManagerダウンロード方法は、次のようになります。私はそれを行うためGCDを使用することができます

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

関連する問題