2015-04-22 2 views
1

Я разрабатываю приложение, которое отображает большое количество изображений. когда я загружаю изображения, нет никаких проблем при загрузке 1000 изображений, когда изображение пересекает 1000, а при сбоях приложения возникают проблемы с памятью. Как его решить? Есть ли способ. Пожалуйста, помогите мне?Как загрузить большое количество изображений в iOS?

Заранее спасибо

+2

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

ответ

2

Ваше приложение рушится из-за потребления слишком много памяти. Поэтому вам нужна стратегия управления памятью, которую использует ваше приложение.

Вам необходимо настроить систему пула, в которой вы загружаете только те изображения, которые могут отображаться «скоро».

Например, если пользователь смотрит на изображение 500, вы можете загрузить в память 498, 499, 501 и 502.

Если они переходят к изображению 501, то вы освободить 498, и нагрузку 503.

Что представляет собой «в ближайшее время» зависит от работы потока, как ваше приложения, но вы должны быть в состоянии придумать что-то работоспособное.

+0

Хороший и короткий ответ –

+0

любой пример кода для выделения и освобождения изображений? было бы действительно полезно для будущих читателей. – bakalolo

+0

Вопрос не указывает двигатель или фреймворк. Кроме того, существует множество способов решения проблемы. В этом случае концептуальный ответ в порядке. Если он не знает, как на самом деле распределять и снимать изображения, он может посмотреть, что (тонны ссылок доступны в google), или задать другой вопрос SO. – Almo

0

Вам нужно придумать систему, похожую на таблицу.

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

Поскольку все ячейки не загружаются одновременно.

Вам нужна аналогичная логика с вашими изображениями; вы НИКОГДА не загружаете все сразу. И если у вас есть причина, то я настоятельно рекомендую загрузить их миниатюру (на самом деле их некачественная версия, например, для просмотра всех ваших изображений в виде сетки).

Для этого вам необходимо знать, какие фотографии должны быть видимыми, и какие фотографии, вероятно, скоро появятся. Для небольших чисел предположим, что у вас всего 10 снимков (вместо 1000).

Пользователь загружает приложение и может видеть изображения 1 и 2 на экране. Вы, очевидно, загрузите их сразу, а также картинку 3 и, скорее всего, картинку 4 (просто убедитесь). Когда он прокручивается, вы ЗНАЕТЕ, что он прокручивает и вам нужен метод, который читает эту прокрутку для динамического выделения правильных изображений. Вы сначала удалите изображение 1 (потому что его первый уйдет) и начните загружать снимок 5.

Таким образом, вместо того, чтобы загружать 1000 изображений, у вас есть только до 5 (в зависимости от размера).

Действительно хороший пример - приложение 9gag, которое загружает изображения прямо под экраном, что означает, что к тому моменту, когда вы читаете первый кляп, следующий уже загружен. «Единственный» способ увидеть загрузку - это прокрутить бит быстрее или иметь плохое соединение.

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

Использование таких вещей, как кеш, массивы, прокрутки (ы) и, возможно, файлы (в зависимости от вашего приложения) - хорошая отправная точка.

0

Возможно, вы получаете дату-образ от некоторого API, потому что смешно сохранять его в устройстве.:)

Мое решение состоит в том, чтобы работать с UITableView или UICollectionView, зависит от того, какой дизайн вы выбираете, потому что эти UIComponents будут управлять памятью для вас, aka выделит видимый один раз + 5 вниз и + 5 вверх и освободит другие.

Кроме того, необходимо будет загрузить изображение-дату асинхронно, так что вы не будет блокировать основной пользовательский интерфейс - нить.

теперь ... если я тебя, я буду определенно идти сторонней библиотеки, такие как AFNetworking в вашем случае, его лучше всего подходит для обработки JSON данные с сервера, а также имеют очень хорошую обработку ошибок ,

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

- (void)downloadImageAsynchronicallyByUrlString:(NSString *)url forIndexPath:(NSIndexPath *)indexPath { 
    // Perofrm request 
    AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]]; 
    [requestOperation setResponseSerializer:[AFImageResponseSerializer serializer]]; 
    [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

     // IF SUCCSESS send dataSource SUCCSESS message 
     [dataSource downloadFinished:responseObject forIndexPath:indexPath]; 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

     // IF FAIL send dataSource FAIL message 
     [dataSource downloadFailAtIndexPath:indexPath]; 
    }]; 

    // Start request!!! 
    [requestOperation start]; 
} 

Объяснение:

Вы называете каждый раз, когда этот метод в cellForRowAtIndexPath в вашем Tableview или itemForRowAtIndexPath, если вы используете CollectionView и я использую протокол для обработки, когда responseObject ака theImage послать responseObject через протокол.

В ваших UIClass где ваш Tableview пр CollectionView живет только реализовать ваш метод протокола

- (void)downloadFinished:(UIImage *)image forIndexPath:(NSIndexPath *)indexPath { 

    // Creating copy of cell 
    _lecturerCell = (LecturersCell *)[_lecturersTableView cellForRowAtIndexPath:indexPath]; 
    // Set downloaded image 
    [_lecturerCell setLecturerImage:image]; 
} 
Смежные вопросы