загрузка нескольких файлов с iPhone - PullRequest
4 голосов
/ 26 апреля 2011

Мое приложение загружает пакеты изображений с сервера.Это массив прямых ссылок (20-50 файлов) из XML.

  • Как мне убедиться, что весь набор изображений полностью загружен?

  • Как добавить условие, чтобы отменить всю загрузку (и удалить все уже загруженные файлы), если приложение было закрыто кнопкой iPhone?(такие методы есть в AppDelegate, в то время как весь мой код загрузки находится в некотором downloadviewcontroller.m)

  • Что еще мне нужно беспокоиться при загрузке нескольких файлов?(Всего 5-10 МБ)

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

    (BOOL) loadImageFromURL:(NSString *)url withName:(NSString *)filename toFolder:(NSString *)folder {

        NSURL *link = [NSURL URLWithString:url];
        NSFileManager *manager = [NSFileManager defaultManager];    
        NSString *filepath = [folder stringByAppendingPathComponent:filename];

        if ([manager fileExistsAtPath:filepath]) {
            return YES;
        }
        else
        { 
            UIImage *image = [[UIImage imageWithData:[NSData dataWithContentsOfURL:link]] retain];
            NSData *data = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0f)];
            if ([data length] <= 0) 
                [image release];
                return NO; // no data
            else 
            {
                [data writeToFile:filepath atomically:YES];
                [image release];            
                return YES;
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Не используйте синхронный вызов dataWithContentsOfURL.Вместо этого посмотрите, как использовать асинхронный метод NSURLConnection, - initWithRequest: Delegate:

Затем вы можете отменить запрос с помощью [connection cancel]; Также вам не придется запускать его в другом потокепотому что он уже асинхронный.

Что касается выполнения нескольких запросов, у вас, вероятно, есть несколько вариантов.Одной из идей было бы создание объекта, который запускает NSURLConnection и анализирует ответ, а затем создает массив этих объектов.

2 голосов
/ 26 апреля 2011

Используйте nsoperation, чтобы сделать это

проверить удар ссылка ..

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

теперь в августе 2012 попробуйте поискать wwdc 2012видео № 211, чтобы научитьсяВы можете использовать блок, чтобы сделать это.

[aNsque addExecutionBlock:^{ ...code... }];

где aNsque - nsblockoperation.

...