AFNetworking не может загрузить несколько файлов m4a на iPad с iOS

У меня есть приложение для iPad, которое загружает музыкальные файлы m4a с сервера. Я использую AFHTTPRequestOperation для загрузки непосредственно в мой документ, находящийся в каталоге outputStreamToFileAtPath. Меня не волнует, сколько времени это займет. Мне просто нужны загруженные файлы, так как загрузка, скорее всего, будет происходить в нерабочее время. Я получаю следующее сообщение об ошибке, когда пытаюсь запустить его на своем iPad. Я получаю первые 5 и последние 5, но затем тайм-аут остальных. Есть ли проблема с моим кодом? Есть ли способ увеличить значение тайм-аута? Или есть что-то еще, что я могу использовать, кроме AFNetworking? Любая помощь/идеи приветствуется.

ERROR ERROR ERROR:Error Domain=NSURLErrorDomain Code=-1001 «Время ожидания запроса истекло». UserInfo = 0xc6e01c0 {NSErrorFailingURLStringKey = HTTP: //xxxx/Music/ece0b7c5ab71a24c6f6694986fc7a4a7.m4a, NSErrorFailingURLKey = HTTP:. //Xxx/Music/ece0b7c5ab71a24c6f6694986fc7a4a7.m4a, NSLocalizedDescription = Запрос тайм-аут, NSUnderlyingError = 0xc69c950 "Запрос тайм-аут" } - не удалось сохранить по пути:/var/mobile/Applications/207B2EFB-78E0-4BB2-8019-026B598ECE44/Documents/music/ece0b7c5ab71a24c6f6694986fc7a4a7.m4a

и код:

- (void)saveFilesToDocDir
{
    NSString *fileLink = @"http://xxx/Music/";
    NSArray *dirPathSearch = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDirPath = [dirPathSearch objectAtIndex:0];
    NSString *dirPath = [docDirPath stringByAppendingPathComponent:@"music/"];

    // if the sub directory does not exist, create it
    NSError *error = nil;
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath:dirPath])
    {
        NSLog(@"%@: does not exists...will attempt to create", dirPath);

        if (![fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:&error])
        NSLog(@"errormsg:%@", [error description]);
    }

    self.processCount = 0;
    for (int i = 0; i < [self.musicFiles count]; i++)
    {
        NSString *filename = [self.musicFiles objectAtIndex:i];
        NSString *urlPath = [NSString stringWithFormat:@"%@%@", fileLink, filename];
        NSString *filePath = [dirPath stringByAppendingPathComponent:filename];

        // download the song file and save them directly to docdir
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlPath]];

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

        operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
        {
            self.processCount++;
            NSLog(@"Song:%d Success!", processCount);

            // all the files have been saved, now update the playlist
            if (self.processCount == [self.musicFiles count])
            {
                [self updatePlaylist];
            }

        } failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        {
            self.processCount++;
            NSLog(@"ERROR ERROR ERROR:%@ - could not save to path:%@", error, filePath);
        } ];

        [operation start];
    }

person LittlePeculiar    schedule 23.07.2012    source источник
comment
в итоге использовал NSOperationQueue - это медленно, но работает.   -  person LittlePeculiar    schedule 24.07.2012
comment
Я сталкиваюсь с той же ситуацией, но использую OperationQueue AFHTTPClient AFNetworking. Любые дополнительные идеи относительно того, почему, когда я ставлю в очередь длинный список операций потоковой загрузки, многие из них истекают с этой ошибкой -1001?   -  person Alfie Hanssen    schedule 31.01.2013
comment
Я добавил [запрос setTimeoutInterval:900] в свой NSMutableURLRequest. Это решило мою проблему. Удачи.   -  person LittlePeculiar    schedule 31.01.2013
comment
Спасибо, LittlePeculiar, вы видели такое же поведение? Т.е. таймауты? К счастью, ваше предложение похоже решило проблему и для меня. Но меня все равно интересует первопричина. Может ли это быть результатом запуска нескольких одновременных операций, одна из которых, например, видео, и она потребляет большую часть потокового трафика в течение определенного периода времени, а время ожидания других выполняемых операций истекло? Или время этих операций истекает еще до того, как они были запущены?   -  person Alfie Hanssen    schedule 01.02.2013
comment
Еще одна странность: некоторые из этих запросов с истекшим временем ожидания никогда не появляются в Charles Proxy, как будто время ожидания запроса истекло еще до того, как он был сделан.   -  person Alfie Hanssen    schedule 01.02.2013
comment
Я тоже думал, что это множественная одновременная операция. Я загружал более 1000 файлов m4a, не очень больших файлов, но достаточно больших. Я играл с maxConcurrentOperationCount, пока не получил наиболее оптимальную загрузку и пошел дальше. Извините, я не могу дать вам лучший ответ. Интересуйтесь тем, что вы узнали.   -  person LittlePeculiar    schedule 01.02.2013


Ответы (1)


[request setTimeoutInterval:1000];

Установите соответствующее значение для интервала (можно использовать это), добавьте его после создания запроса.

person sashi_bhushan    schedule 27.01.2014