- Когда мы идем на наше второе свидание?
- Когда было первое?
- Сейчас.
Первое приложение - это как первая девушка. Вот например, есть у тебя идея для приложения, но ты не знаешь, с какой стороны тебе подойти, так как ты совсем зеленый в этом деле. Сначала пробуешь своими силами, но в большинстве случаев (из-за нехватки опыта) все заканчивается печально. Потом идешь в сеть и пытаешься найти какие-нибудь фреймворки pick up лайны, чтобы тебе было легче написать код подкатить. Но важно отметить, что использование этих волшебных фраз ничего не гарантирует, поэтому очень важно использовать их умело. Далее, ты начинаешь использовать эти пикап лайны, но даже в этом случае у тебя иногда получается, а иногда не выходит и ты сидишь и думаешь "Что не так сделал?" и пробуешь снова, и снова, и снова... пока у тебя не начнет получаться. Итак, прошло 10 дней, с моей последней статьи (ссылки на предыдущие части: Часть I и Часть II) и вот наконец, мне сказали "Да". Встречайте: мое первое приложение "myPlaces". Я использовал несколько pick up лайнов: UIKit, MapKit, CoreLocation, Cosmos и RealmSwift.
В последней статье, приложение могло показывать названия мест, их локацию в текстовом стиле и тип заведения. Еще можно было добавить место и выбрать картинку с галереи или снять самому, но нельзя было сохранять это место. А сейчас, можно найти место используя SearchBar, сохранить место, изменять данные выбранного кафе, сортировать рестораны по имени или по дате, ставить рейтинг, указать локацию на карте или найти место по адресу и в конце проложить маршрут до выбранного места.
Вышеуказанные изменения начались с простой подвязки кнопки Save к строке, используя text?.isEmpty и isEnabled для того, чтобы пользователь был обязан написать название места, если хочет сохранить новое место. До этого кнопка Cancel использовала segue, чтобы вернуться на MainViewController, но стало очевидно что лучше использовать func dismiss. В этом проекте использовал Realm для хранения данных, потому что он лучше и быстрее, чем Core Data и SQLite, которые, в свою очередь, устарели и непонятны новичкам. Для начала нужно было установить Cocoapods, которая не хотела устанавливаться и показывала ошибку, но как оказалось, ошибка была в доступе - благо есть vpn. Но и тут не обошлось без твистов: в терминале он требовал пароль от мака, чтобы дать разрешение установить Cocoapods через sudo. Я бы без проблем ввел пароль, но он не показывал какой пароль ты вводишь и даже сколько значении - просто картинка ключа. Пароль от мака был просто пробел и "он" не хотел принимать - писал, что "пароль неверный". Сменив пароль на числовое значение, "он" одобрил установку. Вывод: ему не понравился мой пароль и пришлось прогнуться под свой мак:)
После установки RealmSwift, пришлось поменять struc на class, так как мы будем ссылаться на другой класс Object (а как мы знаем структуры не умеют это делать). Несколько раз использовал DispatchQueue.main.async - многопоточность уже стучится в дверь (нужно будет почитать на досуге). В видеоуроке советовали установить Realm Studio, чтобы я мог следить за данными. Но студия не хотела устанавливаться и как я понял, больше не поддерживается и требует обновления каждый раз, когда пытаешься запустить программу. Но окей... без студии, так без студии. В будущем, все равно все данные будут браться с инета. После запуска приложения, я удалил массив с данными и поменял модель, так как они уже записались в базу данных. Следующим шагом было добавления свайпа, чтобы пользователь мог удалять место. Скажу честно, эта фича мне очень нравится: легка в создании, но выглядит очень грациозно. В видеоуроке это действие было добавлено через UITableViewRowAction, который уже "was deprecated". Стоить отметить, что эту фразу и восклицательный знак в Xcode я не раз встречал во время моего обучения - Swift меняется на глазах. Поэтому чтобы добавить фичу удаления, я использовал UISwipeActionsConfiguration.
Функция сортировка по имени и дате требовала добавления SegmentedControl, который невозможно закрепить на TableViewController. Поэтому пришлось создавать ViewController и переносить всю модель на новую вьюшку. Но и тут все было не совсем гладко, так как я не мог закрепить constraint-ами сам TableView. Пол часа поломав голову, позвонил ментору. Как оказалось, вся суматоха была из-за одной вкладки, которую нужно было поменять в Layout. Добавление рейтинга мест было сделано через отдельный класс RatingControl. Было полезно узнать, что добавив @IBDesignable перед классом, можно отслеживать в реальном времени изменения кнопки. Но потом я переделал логику рейтинга через Cosmos, который позволял легко добавить звездочки в MainViewController и в NewPlaceController. Последним шагом была работа с картой. Добавление еще одной вьюшки и наложение Map Kit View на нее. А затем написание логики добавления места по адресу и геолокацию юзера - что приводит к конечной цели: проложить путь от юзера до ресторана, чтобы он мог вкусно покушать (не факт).
Разработка данного приложения была очень полезной, так как я познакомился с разными фреймворками и научился использовать их по делу. Но говорят, что упор на фреймворки тоже нельзя делать - ведь, если фреймворк перестанет поддерживаться, придется писать логику самому или находить другой фреймворк. Думаю, для новичка это норма - знать ЧТО делает фреймворк, а на вопрос КАК он это делает, я смогу ответить в будущем, когда от наивного зеленого очкарика превращусь в брутального iOS developer-а (но это не точно). Сейчас, хочу воплотить уже свою идею в жизнь. Надеюсь, скоро вернусь с очередной статьей. Как говорил один известный губернатор: "Айл би бэк"...