7

キューを使用してAFNetworkingを使用していくつかのファイルをダウンロードしています。これが私のコードです:

apiClient =[[AFHTTPClient alloc]initWithBaseURL: [NSURL URLWithString:ZFREMOTEHOST]];
    for (NSString *element in self.productsArray) {
            NSURL *url = [NSURL URLWithString:element];
            NSURLRequest *request = [NSURLRequest requestWithURL:url];

            op = [[AFHTTPRequestOperation alloc] initWithRequest:request];

            NSString *documentsDirectory = nil;
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            documentsDirectory = [paths objectAtIndex:0];

            NSString *targetFilename = [url lastPathComponent];
            NSString *targetPath = [documentsDirectory stringByAppendingPathComponent:targetFilename];

            op.outputStream = [NSOutputStream outputStreamToFileAtPath:targetPath append:NO];

            [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

            } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                //failure case
                NSLog(@"BaaZ  File NOT Saved %@", targetPath);

                //remove the file if saved a part of it!
                NSFileManager *fileManager = [NSFileManager defaultManager];
                [fileManager removeItemAtPath:targetPath error:&error];

                if (error) {
                    NSLog(@"error dude");
                }

                if ([operation isCancelled]) {
                    //that doesn't work.
                    NSLog(@"Canceled");
                }
            }];

            [op setDownloadProgressBlock:^(NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
                if (totalBytesExpectedToRead > 0) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        self.progressView.alpha = 1;
                        self.progressView.progress = (float)totalBytesRead / (float)totalBytesExpectedToRead;
                        NSString *label = [NSString stringWithFormat:@"Downloaded %lld of %lld bytes", totalBytesRead,totalBytesExpectedToRead];
                        self.progressLabel.text = label;
                    });
                }
            }];
        [self.resourcesArray addObject:op];

        }
    for (AFHTTPRequestOperation *zabols in self.resourcesArray) {
        [apiClient.operationQueue addOperation:zabols];
    }

コードはファイルのダウンロードで正常に機能していますが、キャンセル機能が必要なため、以下のコードを持つアクションのボタンがあります。

[apiClient.operationQueue cancelAllOperations];

操作はファイルをキャンセルしますが、Documentsフォルダーにいくつかのジャンクファイルがあります。ジャンクとは、ダウンロードを開始したファイルを意味します。キャンセルすると、同じ名前のファイルが表示されますが、破損しているため、役に立たないファイルを開くことができません。

AFがそれを行わないようにし、キャンセルしたときに完成したファイルのみを保持するにはどうすればよいですか?

どんな助けでもありがたいです。

また、そのような仕事ごとに仕事をキャンセルしてみました:

for (AFHTTPRequestOperation *ap in apiClient.operationQueue.operations) {
        [ap cancel];
        NSLog(@"%@",ap.responseFilePath);
        NSFileManager *fileManager = [NSFileManager defaultManager];
        [fileManager removeItemAtPath:ap.responseFilePath error:nil];

    }

ジャンクファイルを削除しますが、それも機能しません。

4

2 に答える 2

7

AFDownloadRequestOperation拡張機能を使用してみてください。さらに、部分的なダウンロードの再開をサポートし、一時ディレクトリを使用し、正しいダウンロードの進行状況を計算するのに役立つ特別なブロックがあります。

于 2013-01-02T22:57:33.360 に答える
-1

あなたもそれを試すことができます:github

于 2013-02-26T12:05:12.117 に答える