Генерация изображений в фоновом режиме - PullRequest
2 голосов
/ 24 февраля 2012

В настоящее время я создаю приложение, которое генерирует изображения и сохраняет их в NSMutableArray, который затем используется в UINavigation (Cell.imageView.image).Мне нужно иметь возможность обрабатывать до 2000 изображений без задержки в моем приложении.

В настоящее время я задаю этот способ генерации, вызывая метод генерации при обращении к cellForRowAtIndexPath.Которая, по-видимому, вызывает задержку в 4-5 секунд до вызова следующей навигации.

к счастью, после этих 4-5 секунд генерация завершена, и проблем нет.

В мире iProducts ожидание 4-5 секунд на самом деле не вариант.Мне интересно, каковы мои варианты создания этих изображений в фоновом режиме.Я пытался использовать темы [self performSelectorInBackground:@selector(presetSnapshots) withObject:nil];но это только дало мне проблемы с векторами по какой-то причине.

Вот генерирующий код:

-(void)presetSnapshots{
    //NSAutoreleasePool* autoReleasePool = [[NSAutoreleasePool alloc] init];
    for (int i = 0; i < [selectedPresets count]; ++i){
        GraphInfo* graphInfo = [selectedPresets objectAtIndex:i];
        graphInfo.snapshot = [avc takePictureOfGraphInfo:graphInfo PreserveCurrentGraph:false];
        [graphInfo.snapshot retain];
    }
    //[autoReleasePool drain];
    presetSnapshotFinished = YES;

}

внутри - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { есть

   if (presetSnapshotFinished == NO){
        [self presetSnapshots];
        //[self performSelectorInBackground:@selector(presetSnapshots) withObject:nil];

    }

    cell.imageView.image = [[selectedPresets objectAtIndex:indexPath.row] snapshot];

Править:

Я также предпочитаю не использовать coreData для этого.Изображения размером 23x23 и размером около 7 КБ.Таким образом, около 6 МБ используется в любой момент времени в памяти.

1 Ответ

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

Вы можете использовать Grand Central Dispatch (GCD) для запуска [self presetSnapshots]

dispatch_queue_t working_queue = dispatch_queue_create("com.yourcompany.image_processing", NULL);
dispatch_queue_t high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,NULL);
dispatch_set_target_queue(working_queue,high);
dispatch_queue_t main_queue = dispatch_get_main_queue();

dispatch_async(working_queue,^{
    if (presetSnapshotFinished == NO){
       [self presetSnapshots];
    }
    dispatch_async(main_queue,^{
        cell.imageView.image = [[selectedPresets objectAtIndex:indexPath.row] snapshot];
    });
});
...