使用afnetworking一次下载一个文件

时间:2016-06-21 10:01:01

标签: ios objective-c afnetworking

我有array,其中包含不同的网址。我想下载一个带进度条的文件,而不是开始下一个等等。

这是我到目前为止的代码;

-(void) func:(NSArray *) arry
{

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    configuration.timeoutIntervalForRequest = 900;
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

    NSMutableArray * downloadedUrl = [[NSMutableArray alloc] init];
    for (NSString * str in arry) {
        NSURL *URL = [NSURL URLWithString:str];
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];

        NSURLSessionDownloadTask downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL (NSURL targetPath, NSURLResponse response) {
             NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES];

             return [tmpDirURL URLByAppendingPathComponent:[response suggestedFilename]];
        } completionHandler:^(NSURLResponse response, NSURL filePath, NSError *error) {

            if(error)
            {
                NSLog(@"File Not Dowloaded %@",error);

            }

        }];
        [downloadTask resume];
    }
}

如何使用进度条一次下载一个文件,然后从数组中删除网址?

2 个答案:

答案 0 :(得分:2)

声明一个全局NSMutableArray文件,并在下面的函数中使用它。

-(void) downloadFile {

     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
     configuration.timeoutIntervalForRequest = 900;
     AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

     NSURL *URL = [NSURL URLWithString:[self.fileArr firstObject]]; //Here self.fileArr is your global mutable array
     NSURLRequest *request = [NSURLRequest requestWithURL:URL];

     NSURLSessionDownloadTask downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL (NSURL targetPath, NSURLResponse response) {
     NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES];

        return [tmpDirURL URLByAppendingPathComponent:[response suggestedFilename]];
     } completionHandler:^(NSURLResponse response, NSURL filePath, NSError *error) {

        if(error)
        {
            NSLog(@"File Not Dowloaded %@",error);
            [self downloadFile];
        }
        else {
            [self.fileArr removeObjectAtIndex:0];
            if (self.fileArr.count > 0) {
                [self downloadFile];
            }
        }
    }];
    [downloadTask resume];
}

现在调用此函数,但在initialize self.fileArr之前调用此函数,之后调用downloadFile方法。

希望这会对你有所帮助。

答案 1 :(得分:1)

一次将队列限制为一个操作,

为此,尝试在排队之前在每个操作之间添加依赖关系。

如果在添加到队列之前添加两个操作之间的依赖关系,比如operation1和operation2,那么在operation1完成或取消之前,operation2将不会启动。

这样做:

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];

// Make operation2 depend on operation1

[operation2 addDependency:operation1];

[operationQueue addOperations:@[operation1, operation2, operation3] waitUntilFinished:NO];

<强>更新

// Create a http operation

NSURL *url = [NSURL URLWithString:@"http://yoururl"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

[httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];

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

    // Print the response body in text

    NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog(@"Error: %@", error);

}];

// Add the operation to a queue
// It will start once added

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperation:operation];

希望它对你有帮助..!