скачать несколько файлов на iphone - PullRequest
1 голос
/ 16 марта 2011

Я хочу скачать файл (ы) с веб-сервера.

Сценарий: Когда пользователь выберет строку (имя файла - пользователь может выбрать 1 или более файлов для загрузки) и нажмет на кнопку загрузки, я получаю 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];  
    }  
}    

если я не использую для цикла, т. Е. Загружается только один файл, то он работает нормально, но не для цикла ... это действительно важно для меня, чтобы решить эту проблему.

большое спасибо

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

взгляните на ASIHTTPRequest, у него есть хорошая очередь для загрузки и мониторинга прогресса http://allseeing -i.com / ASIHTTPRequest / How-to-use

1 голос
/ 16 марта 2011

Вы используете асинхронную загрузку, но делегатом для каждого элемента загрузки является один и тот же объект, в результате чего все загруженные данные добавляются в один и тот же файл. Я делаю так, чтобы у меня был маленький объект (DownloadQueueItem), который является делегатом для одной загрузки. Когда вы загружаете другой файл, вы создаете новый DownloadQueueItem, и он обрабатывает все.


Edit:

Q: вместо%, который я ставлю сам, я ищу, есть ли способ каждый раз создавать новый файл, например, если "" NewResult.zip "существует, тогда создайте" NewResult1 " почтовый индекс "и т. д.

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;
    }
}
...