2017-02-02 5 views
0

Я планирую отправить приложение с не менее чем 20 картинками, которые могут быть размером 10 МБ каждый. Это снимки, которые пользователь, вероятно, увеличит в несколько раз, поэтому необходимо поддерживать разрешение достаточно высоким. Мы все еще пытаемся сделать их меньше, но даже в этом случае маловероятно, что они будут меньше 7 мб каждый.Хранение больших фотографий в iOS swift

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

Каков наилучший механизм для их хранения и как их хранить в iOS Swift 3?

Спасибо за вашу помощь заранее.

+1

Во-первых, это не имеет никакого отношения к Swift3. Поскольку активы не имеют отношения к языку программирования. Для этих больших файлов это имеет смысл для плитки. Демо: https://developer.apple.com/library/content/samplecode/PhotoScroller/Introduction/Intro.html – rckoenes

ответ

2

Вы можете сохранить свои фотографии в каталоге документов приложения и сохранить путь в SQLite DB.

2

Есть не правила, а набор лучших практик.
Чтобы сохранить их, я предлагаю вам сохранить их непосредственно в ваших ресурсах, а не в объекте Xcode, это потому, что «ресурс изображения» можно вызвать только с помощью метода imageNamed:UIImage, который имеет побочный эффект от изображений кеша.
Затем вы можете создать файл plist с массивом имен изображений и получить информацию отсюда. Если вам нужно что-то более сложное, есть Core Data, но я не вижу его применения с вашей спецификацией.

Каков размер несжатого изображения в памяти?
прибл уравнение n_pixel_height * n_pixel_width * n_channels в байтах (предположим, 8 бит на канал)

Если ваши изображения около 10Мб в JPG они сжимаются, таким образом, означает, что они будут принимать огромное количество памяти. память на таких устройствах - драгоценный и короткий ресурс.
Если ваше приложение превышает лимит памяти, после набора обратных вызовов, таких как didReceiveMemoryWarning, если вы не освободите достаточно памяти, приложение будет убито.
Alway попробуйте устройство в этом случае, а не на симуляторе, потому что симулятор использует ваши ресурсы mac.
Теперь как обрабатывать большие изображения?
Вы можете использовать CATiledLayer, вы можете найти множество обучающих онлайн. CATiledLayer, как подсказывает название, создает плитки слоя, каждая плитка должна соответствовать части вашего изображения, и она рисует их только тогда, когда они видны.
К сожалению, он рисует асинхронно, это означает, что ваши плитки могут быть показаны не точно в одно и то же время, есть стратегия, чтобы избежать этой проблемы, одна из них объясняется в яблоке sample code.
Конечно, есть проблема, которую нужно решить, как я могу вырезать большие изображения в плитки?
Вы можете делать программно или предоставлять их уже срезанные ресурсы вашего приложения

Смежные вопросы