Адаптивное кэширование изображений в зависимости от уровня доступной оперативной памяти или уровня памяти iOS. - PullRequest
4 голосов
/ 18 марта 2012

У меня есть приложение, которое кэширует большие изображения, чтобы пользователь не ждал 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 приводит к сбою.

Ответы [ 2 ]

0 голосов
/ 30 августа 2012

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

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

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

0 голосов
/ 03 августа 2012

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

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

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

...