Адаптивное кэширование изображений на основе уровня предупреждения о доступной оперативной памяти или памяти iOS.

У меня есть приложение, которое кэширует большие изображения, чтобы пользователь не ждал imageWithContentsOfFile. Как правило, я кэширую предыдущее и следующее изображение.

1) Могу ли я сделать это кэширование адаптивным в зависимости от доступной памяти в iPad? Если да, то каким должен быть порог? Ниже приведена функция для расчета доступной памяти.

-(void) report_memory {
    struct task_basic_info info;
    mach_msg_type_number_t size = sizeof(info);
    kern_return_t kerr = task_info(mach_task_self(),
                                   TASK_BASIC_INFO,
                                   (task_info_t)&info,
                                   &size);
    if( kerr == KERN_SUCCESS ) {
        Log(@"Memory in use (in bytes): %u", info.resident_size);
    } else {
        Log(@"Error with task_info(): %s", mach_error_string(kerr));
    }
}

2) Я знаю, что нет никакого способа (кроме частного/недокументированного API) узнать предупреждение об уровне памяти, иначе это может быть хорошим фактором для определения того, сколько страниц я могу кэшировать. Но просто чтобы подтвердить, могу ли я их как-то использовать.

3) Прямо сейчас я думаю о кэшировании 3 экранов (с 6 изображениями), и в случае, если мой ViewController получит предупреждение о памяти, я выгружаю все экраны, кроме видимого, и сбрасываю количество экранов для кэширования до 2 (4 изображения). Но я не нашел его оптимизированным, потому что либо я кэширую меньше, чем возможно, либо в некоторых условиях даже загрузка 4 приводит к сбою.


person msk    schedule 18.03.2012    source источник


Ответы (2)


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

Альтернативой может быть запуск процедуры кэширования до тех пор, пока не сработает предупреждение. Это позволит вам создать количество элементов, которые можно кэшировать. Как только это число будет достигнуто, вы можете сделать так, чтобы ваши итерации кэширования оставались достаточно ниже этого значения, чтобы избежать проблем.

Не совсем подробное объяснение, но это некоторые идеи по использованию доступных стандартных методов, которые все еще должны быть в состоянии достичь вашей цели.

person Abandoned Cart    schedule 30.08.2012

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

Вы должны избегать любого недокументированного API, чтобы получить уровень предупреждения и принять меры на его основе. Единственное предлагаемое действие при предупреждении о памяти, независимо от уровня, — освободить как можно больше памяти. Вы можете использовать эвристику, основанную на функции report_memory (см. вопрос), чтобы определить, сколько мы можем кэшировать. Хотя я не проводил никаких тестов для расчета порога (он должен основываться на общем объеме оперативной памяти). Я хотел бы видеть, как кто-то выполняет эти тесты и обновляет.

Подход к сбросу количества страниц для кеша при предупреждении о памяти отлично работает в моем случае.

person msk    schedule 03.08.2012
comment
Вы можете попытаться попросить о помощи, не будучи грубым, и если вам нужны ответы, помогите другим понять вас, используя соответствующий язык и менее сложную терминологию. Ваш первоначальный ответ не имел смысла, и редактирование комментария, который не полностью понят, может изменить весь контекст. - person Abandoned Cart; 30.08.2012
comment
Вы могли бы быть лучше в своем первоначальном комментарии, которого сейчас нет. В любом случае спасибо за ваш ответ. - person msk; 30.08.2012
comment
Я удалил его, потому что вы изменили свой ответ таким образом, что он больше не похож на стенограмму орфографической пчелы. - person Abandoned Cart; 04.09.2012