在iphone上下载多个文件

时间:2011-03-16 13:06:32

标签: iphone objective-c loops download nsurlconnection

我想从网络服务器下载文件。

方案: 用户将选择行(文件名 - 用户可以选择一个或多个要下载的文件)并按下载,我将获取每个文件的URL(所有文件都有不同的URL)并存储到pathArray中。 并做以下

-(void)downloadFile    {  
    for (int i = 0; i<[pathArray count]; i++) {    
        NSURL *fileURL = [NSURL fileURLWithPath:[pathArray objectAtIndex:i]];  

        NSString *ResultURL = [fileURL absoluteString];  
        NSURL *url = [[NSURL alloc] initWithString:ResultURL];   
        NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL: url   
        cachePolicy: NSURLRequestReloadIgnoringCacheData  timeoutInterval: 60.0];   
        conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];  

        if (conn)   {
          NSLog(@"*************CONNECTED************");  
          webData = [[NSMutableData data] retain];  
          NSLog(@"weblength : %d : ", [webData length]);  
          downloadTag = YES;  
        } else {
            NSLog(@"*************Connection NOT DONE************");  
            downloadTag=NO;  
        }  
    }  
}


-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  {  
    NSLog(@"*************Try to receive data************");  
    [webData appendData:data];  
    NSLog(@"weblength : %d : ", [webData length]);  
    NSLog(@"*************Data Received an append too ***********");  
    if (downloadTag == YES)  {  
        paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
        self.documentsDir = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"NewResult.zip" ];  
        [[NSFileManager defaultManager] createFileAtPath:documentsDir contents:nil attributes:nil];  
        NSFileHandle *file1 = [NSFileHandle fileHandleForUpdatingAtPath: documentsDir];  
        [file1 writeData: webData];  
        NSLog(@"Webdata : %d",[webData length]);  
        [file1 closeFile];  
    }  
}    

如果我不使用for循环,即只有一个文件下载,那么它工作正常,但不是for for循环......对我来说解决这个问题非常重要。

非常感谢

2 个答案:

答案 0 :(得分:2)

看看ASIHTTPRequest,它有一个很好的队列来下载和监控进度http://allseeing-i.com/ASIHTTPRequest/How-to-use

答案 1 :(得分:1)

您正在使用异步下载,但每个下载项的委托都是同一个对象,导致所有下载的数据都附加到同一个文件中。我这样做的方法是让一个小的Object(DownloadQueueItem)作为单个下载的委托。当您下载另一个文件时,您将创建一个新的DownloadQueueItem并处理所有内容。


编辑:

问: 而不是%i我自己正在搜索有没有办法每次创建新文件,如果“”NewResult.zip“存在则创建”NewResult1 .zip“等等

A:您可以这样做:

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filename = @"NewResult%@.zip";
for (int i = 0; ; i++) {
    NSString *filename = NULL;

    if (i == 0) {
        filename = [NSString stringWithFormat:filename, @""];
    }
    else {
        filename = [NSString stringWithFormat:filename, [NSString stringWithFormat:@"%i", i]];
    }

    if (![[NSFileManager defaultManager] fileExistsAtPath:filename]) {
        // Save file.
        break;
    }
}