Загрузка данных в программу, подскажите, как правильнее?


#1

Доброго времени!

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

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

Из тех знаний, что я имею сейчас, вижу один путь: набрать все вопросы одним списком в txt или rtf файле и разделить их все каким-нибудь маркерами. Этот файл вложить в проект. При загрузке программы считать его в string переменную, а потом сделать “сепорейт” по маркерам и разрезанную на отдельные вопросы строку разложить в массив. А оттуда и выводить отдельные вопросы на экран.

С точки зрения поставленной задачи - это нормальный путь ее решения? Или это будет как гланды через ж… и есть что-то гораздо более правильное, исходя из идеологии iOS программирования? Если да - направьте меня, плиз.


#2

Если не хотите делать через БД, тогда это еще можно сделать через plist файл. Там уже имеется тип массива, так что останется лишь прочитать plist файл и получить свой массив с вопросами.


#3

Тут как в анекдоте, 2 путя (на самом деле больше).

  1. Если у тебя приложение имеет статичный набор вопросов и вопросы будут обновляться с появлением новой версии, то можешь сделать файлик json добавить его и внутри сверстать все вопросы-ответы в нужном тебе формате. Если предполагается какая-то стилизация текста, можешь прям в тексте теги html фигачить, а потом это переводить в атрибутную строку (про это надо будет почитать, но вопрос не сложный). Данные в этом случае можно парсить на лету и показывать пользователю. Либо при первом запуске распарсить, сохранить в базу, и читать уже из базы. Возьми realm. (По моему мнению с ним разобраться проще чем с CoreData).

  2. Если же надо данные обновлять на лету, то чтобы свой сервер не сочинять, попробую пройти курс по FireBase и сделать базу там. Я не большой специалист в FireBase, но там это делается не так сложно.

С текстовиками, plist и прочими штуками сложней будет реализация.
С json проще тем, что ты напишешь какой-нидь класс (сервис), который будет получать данные сначала из файла, а когда вдруг реализуешь настоящий сервер, который будет возвращать json с сети, ты просто вместо файла подставишь результат сетевого запроса и код переписывать фактически не придется.


#4

c plist ничего понимать не надо: туда точно также просто массив экземпляров класса сохраняется и всё - т.е. действующая модель данных в большинстве случаев


#5

Спасибо всем, счас буду гуглить по темам создания и использования plist, realm, json. Посмотрим, осилю ли 8). Если что, реализую по своему варианту, вроде никто не заклеймил, что в данном случае это неправильно/неэтично/не по фэншую.

Для RexHunt “Если не хотите делать через БД, тогда это еще можно сделать через plist файл.”

Я не “не хочешь”, я видимо просто “не знаешь” как и что это.

Из того, что я пока узнал про Swift и XCode я так понимаю, что в любом случае надо иметь свой источник данных (txt файл ли, plist ли, сервер ли), откуда после запуска программа считывает данные и сохраняет их себе либо в массив, либо в CoreData (сейчас вот еще про Realm услышал), а только потом может использовать. Или я не прав?


#6

Если про БД, то Firebase простой инструмент: realtime database либо firestore. По мне, так firestore удобнее, проще и перспективнее.

Про сохранение в файл plist подробно разобрано здесь на форуме.


#7

Тоже интересует эта тема. Чтобы не плодить спрошу здесь - можно например в отдельном файле создать словарь данных(и внести туда необходимую информацию) и описать класс для этих данных. Затем написать функцию где в цикле пройтись по словарю, создать массив нужных объектов и вернуть его и дальше эти данные отобразить. Или это корявый и неправильный способ. Подскажите пожалуйста.


#8

В случае с данными, не мучайтесь. Поставьте реалм. И храните данные там.


#9

Да, судя по всему - Realm - то, что доктор прописал. СПАСИБО Tau за наводку.

Исходя из обучающих видео и описаний в РАЗЫ проще CoreDate. И базу данных можно легко заполнить еще на стадии создания проекта через Realm браузер, если я правильно понял. У меня аж глаз загорелся и руки зачесались скорее поставить и попробовать такую красоту.

Правда есть одно но - я на радостях в вскр бросился его ставить, ну и как-то установка мне не поддалась. Читаю - все вроде должно быть достаточно просто - через CocaoPods, а у меня не взлетает 8(. CocaoPods установился, реалмовское окружение в проекте вроде сгенерировалось, но в секции Pods в Project Navigatore папки Realm.framework и Foundation.framework красным подсвечивает и не компилирует. Пока не понял, что не так. Завтра буду дальше шаманить.

Видимо простота эксплуатации окупается сложностью установки 8)). Или я просто рукож…п такой. Если что, буду тут помощи просить.


#10

Чем вас сохранение в файл не устроило? Элементрано же ))


#11

Не, ну хочется-то все по-взрослому, а не только целоваться. 8))))

Ну и задел на будущие проекты…


#12

Realm - локалка. Сеть за плату. Тогда уж лучше firebase. В локальном плане мне почему-то кажется, что лучще освоить работу с fileManager - полезнее в будующем )


#13

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


#14

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

“А можно всех посмотреть…” 8)


#15

Чтоб всех посмотреть надо освоить книжки Wenderlich-а (там каждая по 400+ страниц).


#16

Уф, Realm у меня таки взлетел. Правда через CocaoPods так и не захотел, но я смог установить его в проект ручками. Теперь объекты реалма создаются, сохраняются, считываются. Красота.

Подскажите только еще один вопрос. А куда собственно он на диск записывает созданные объекты? Хочу просмотреть созданную базу “Реалм Браузером”, а не понимаю, где она. Я по наивности думал, что файл с БД сгенерируется в папке проекта, но там, кажется, ничего лишнего не появилось.


#17

Обнови репозиторий cocoapods (pod update repo). Он через поды ставится без проблем.

по поводу файла. В appDelegate пропиши. И в консоли будешь иметь актуальный путь к документам.

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
print("\n\(documentsPath)\n")

#18

[Tau], спасибо за советы! Все, взялся за изучение. Нашел через сайт Real еще один способ найти его файл - прописать в viewDidLoad() строчку

print(Realm.Configuration.defaultConfiguration.fileURL!)