Как асинхронно загрузить 1000 изображений? - PullRequest
1 голос
/ 06 февраля 2012

Я загрузил около 1000 изображений с URL-адресов в файловую систему iPhone, но я хотел бы сделать это асинхронно. В настоящее время я использую этот код:

-(void)saveImageInFile:(NSString *)imageName image:(UIImage *)img{

    // add the images in the file
    NSData *tmpData;

    if ([self.constImageType isEqualToString:@"png"]) {
        tmpData = UIImagePNGRepresentation (img);
    }

    else if ([self.constImageType isEqualToString:@"jpg"]) {
        tmpData = UIImageJPEGRepresentation(img, 0.7f);
    }

    NSString *path = [self.documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName,self.constImageType]];
    //NSLog(path);
    [tmpData writeToFile:path atomically:YES];

}

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Я делаю нечто похожее с гораздо большим количеством изображений, чем 1000. Я сохраняю URL для изображений в основных данных, а затем получаю NSArray всех записей, где атрибут записи imageDownloaded = NO. При загрузке изображений я установил для этой записи значение imageDownloaded = YES, поэтому, если приложение нуждается в перезапуске, оно может начать с того места, на котором оно остановилось.

Вот небольшой пример того, что происходит. Я использую Grand Central Dispatch для фоновой обработки этого процесса, поэтому я не блокирую основной поток.

__block NSArray *records; //...get records

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
        NSString *documentsDirectory = [paths objectAtIndex:0];

        for (NSManagedObject *obj in records) {
            NSString *imageName = [obj valueForKey:@"filename"];

            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",[obj valueForKey:@"remote_path"],imageName]];
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
            NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL];
            [responseData writeToFile:[NSString stringWithFormat:@"%@/%@",documentsDirectory,imageName] atomically:NO];
            [obj setValue:[NSNumber numberWithBool:YES] forKey:@"imageDownloaded"];
        }
    });

Дополнительная информация о Grand Central Dispatch https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

1 голос
/ 07 февраля 2012

Я предлагаю вам скачать https://github.com/ZarraStudios/ZDS_Shared и сделать

// queue download
[[ZSAssetManager singleton] queueAssetForRetrievalFromURL:url]; 

// recover the download from the file system
UIImage *imagen = [[ZSAssetManager singleton] imageForURL:url];

Зачем использовать эту библиотеку?

  • Он ограничивает / приостанавливает / возобновляет загрузку в зависимости от доступной пропускной способности и состояния сети.Обратите внимание, что он использует NSOperationQueue, который может быть приостановлен (в отличие от блоков).
  • Он обрабатывает создание имени файла из хеша URL, чтобы избежать коллизий.
  • При запуске приложения он считывает в памятьсписок уже кэшированных файлов.
  • Опционально разрешает кэширование, когда приложение переходит в фоновый режим.
  • Вы можете установить срок действия файлов (или без срока действия).
  • Он сбрасывает кэш памяти, если приложение получает предупреждение о том, что вы слишком быстро читаете UIImages из кэша.
  • Он прост в использовании (только две строки выше).

Если вы хотите развернуть свое собственное решение, оно может помочь вам прочитать исходный код этой библиотеки, поскольку все это уже реализовано.

0 голосов
/ 07 февраля 2012

Читать о Grand Central Dispatch (GCD) .

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

Вот краткий пример:

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

dispatch_async(queue, ^{
// This is a BLOCK. Put code here to download images in background...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...