Загрузка нескольких файлов записывает одни и те же данные во все файлы - PullRequest
1 голос
/ 17 мая 2011

Попытка загрузить несколько файлов из XML-канала.Есть несколько категорий, и каждая категория имеет неизвестное количество изображений.Я создаю подкаталог для каждой категории, без проблем.Когда я пытаюсь загрузить каждый файл в соответствующую категорию, каждый файл записывается с одинаковыми данными для каждого изображения в ленте.

Я предполагаю, что мой вопрос заключается в том, как загрузить один файл за разсоответствующий каталог без перезаписи всех изображений с одинаковыми данными?

-(void)parsingComplete:(XMLDataSource*)theParser 
{
    /*  iterate through the Categories and create the 
        sub-directory if it does not exist  
     */

    for (int i = 0; i < [categories count]; i++) 
    {
        NSString *cat      = [NSString stringWithFormat:@"%@/%@",BASE_DIR,[[categories objectAtIndex:i] objectForKey:@"name"]];
        NSString *catName  = [[categories objectAtIndex:i] objectForKey:@"name"];
        NSArray  *catArray = [[categories objectAtIndex:i] objectForKey:@"images"];

        /*  create the sub-direcotry naming it the #category# key  */
        if (![FILEMANAGER fileExistsAtPath:cat]) {
            [FILEMANAGER createDirectoryAtPath:cat withIntermediateDirectories:NO attributes:nil error:nil];
        }

        //NSLog(@"\n\nCategory: %@",cat);
        for (int x = 0; x < [catArray count]; x++) 
        {
            /*  download each file to the corresponding category sub-directory  */

            fileOut = [NSString stringWithFormat:@"%@/%@_0%i.jpg",cat,catName,x];

            NSURLRequest * imageRequest = 
            [NSURLRequest requestWithURL:[NSURL URLWithString:[[catArray objectAtIndex:x] objectForKey:@"imageUrl"]]
                             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30.0];
            [[NSURLConnection alloc] initWithRequest:imageRequest delegate:self];
        }
    }
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection  
{  
    [receivedData writeToFile:fileOut atomically:YES];
} 

1 Ответ

3 голосов
/ 17 мая 2011

Да, это то, что я упомянул в своем комментарии . Каждый раз, когда вызывается connectionDidFinishLoading:, вы получаете результат только одного соединения. Если вы перебираете все имена файлов, вы будете многократно записывать один и тот же кусок данных во все эти имена. Каждый раз в цикле for в parsingComplete: вы создаете новое соединение, получаете новый объект данных, а затем записываете один и тот же объект несколько раз. После окончания цикла parsing... у вас останется список файлов с данными последнего подключения.

Я очень устала и не уверена: мне ясно?


Обращаясь к вашему комментарию:

Вам нужно будет либо сделать правильное имя файла для текущего соединения доступным для методов делегата, возможно, поместив его в ivar, либо перейти по синхронному маршруту. Вставка в него некоторого ивара, такого как currFileName, чтобы все методы этого класса могли получить к нему доступ, вероятно, является наименее безболезненным способом выполнения работы.

/* In parsingCompleted: */
for (int x = 0; x < [catArray count]; x++) 
{
    /*  download each file to the corresponding category sub-directory  */
    // fileOut is an instance variable
    fileOut = [NSString stringWithFormat:@"%@/%@_0%i.jpg",cat,catName,x];
    imageRequest = [NSURLRequest etc...

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // No loop; just use that file name that you set up earlier; 
    // it correctly corresponds to the current NSURLConnection
    [receivedData writeToFile:fileOut atomically:YES];
...