Невероятная «легкость бытия» с Core Data в iOS 10 и Swift 3.

Мы рассмотрим выполнение Задания 5 для курса «Developing iOS 9 Apps with Swift» на Swift 3 для iOS 10.
Почему это интересно?
Особенный интерес связан не столько со Swift 3, сколько с Core Data, который до выхода iOS 10 являлся одним из самых непонятных и сложных в использовании фреймворков, особенно в многопоточной среде.  На WWDC 2016 Apple представила в iOS 10 одну из самых значительных модернизаций Core Data со времен iOS 5.

Возможности новой Core Data в iOS 10

Во главе нового Core Data стоит класс NSPersistenceContainer, представляющий собой прекрасный полноценный Core Data Stack, который очень просто создать и использовать.  Класс NSPersistenceContainer снабжает вас очень простым  API:

screen-shot-2016-10-21-at-5-54-14-pm

Как это видно из названия, управление «видимыми» объектами Core Data осуществляется View Controllers на main queue с использованием viewContext. Очень легко работать с объектами Core Data в фоновом (background) режиме c помощью контекста, возвращаемого методом newbackgroundContext(). Но еще лучше, проще и оптимальнее выполнять различные операции с Core Data в фоновом (background) режиме с помощью метода performBackgroundTask(_:), который сам предоставляет разработчикам NSManagedObjectContext для выполнения этих операций:

screen-shot-2016-10-23-at-7-58-25-pm

Такой простой public API существенно снизит порог вхождения в Core Data.

Читать далее

Как заставить работать класс CoreDataTableViewController в Swift 3

screen-shot-2016-10-15-at-9-44-52-pm

Этот пост написан в продолжение поста «Как работать с курсом «Developing iOS 9 Apps with Swift»  в Xcode 8 с Swift 2.3  и Swift 3″.  Дело в том, что в Swift 3  запрос NSFetchRequest<NSFetchRequestResult> стал Generic, а следовательно, стал Generic и класс NSFetchResultsController<NSFetchRequestResult>. В результате возникли некоторые трудности при использовании в Swift 3 фантастически удобного класса CoreDataTableViewController, который разработан профессором Полом Хэгерти и предоставлен студентам Стэнфорда для удобной работы с данными Core Data в таблицах Table View. В этом посте я показываю, как эти трудности разрешить и заставить работать класс CoreDataTableViewController в Swift 3, и не только в iOS9, но и в iOS 10.

Вначале  очень кратко напомню  о том, откуда появился класс  CoreDataTableViewController. Когда у вас огромное количество информации в базе данных, то прекрасным средством показа этой информации является Table View. В 99% случаев либо Table View, либо Collection View используются для показа содержимого больших баз данных. И это настолько распространено, что Apple обеспечила нас в iOS прекрасным классом NSFetchedResultsController, который “подвязывает” запрос NSFetchRequest к таблице UITableView
И не только “подвязывает” лишь однажды, а эта “подвязка” действует постоянно и, если в базе данных каким-то образом происходят изменения, NSFetchRequest возвращает новые результаты и таблица обновляется. Так что база данных может меняться “за сценой”, но таблица UITableView всегда остается в синхронизированном с ней состоянии. Это действительно очень очень круто.
 NSFetchResultsController обеспечивает нас методами протоколов UITableViewDataSource и UITableViewDelegate, такими, как numberOfSectionsInTableView, numberOfRowsInSections и т.д. Единственный метод, который он не реализует, — это cellForRowAtIndexPath. Вам самим придется реализовать его, потому что для реализации метода cellForRowAtIndexPath нужно знать пользовательский UI для ячейки таблицы, а вы — единственный, кто знает, какие данные и как они размещаются на экране. Но что касается других методов протокола UITableViewDataSource, даже таких, как sectionHeaders и всего остального, NSFetchedResultsController берет все на себя.

Как работать с NSFetchResultsController?

Читать далее

Лекция 18 CS193P Spring 2016 — Persistence (постоянное хранение данных).

screen-shot-2016-10-13-at-1-17-46-pm
Хотя название Лекции 18 — Persistence (постоянное хранение данных), оказалось, что это как раз то, о чем профессор не успел сказать. Однако не стоит об этом сожалеть, потому что эту тему можно посмотреть  «Лекция 16:  Фотокамера, Постоянное Хранение и Вставка Картинки в картинку (Camera, Persistence and Embed Segues)» более  раннего курса  «Developing iOS 8 Apps with Swift»   стэнфордского университета  CS193P зима 2015 года.  .
 А Лекция 18 получилась фантастически полезной, так как  это  продолжение большого демонстрационного приложения Trax, в котором на примере работы с картой ( MapKit ) демонстрируются различного рода segues: модальный segue, Popover segue, Unwind segue как на iPad, так и на iPhone. Но это только основные направления, помимо которых в решение усложняющейся задачи вовлекаются все новые механизмы iOS программирования:

  • «радиостанции» в текстовых полях,
  • усовершенствование работы с клавиатурой
  • “переезд” (segueing) от MKMapView
  • создание на карте перемещаемых  и редактируемых «булавок» (pins)
  •  Autolayout c «нечеткими» границами и его использование для расчета предпочтительного размера MVC
  • управление поведением адаптивной презентации на приборах горизонтального Compact Size Class (iPhones)
  • визуальные эффекты (типа, Blur — “затуманивание”)

Читать далее

Как работать с курсом «Developing iOS 9 Apps with Swift» в Xcode 8 с Swift 2.3 и Swift 3.

Стэнфордский курс CS193P Spring 2016  «Developing iOS 9 Apps with Swift«  читался для Xcode 7 и Swift 2.2.

До момента выхода новой версии Xcode 8, каждая версия Xcode была привязана к определенной версии языка программирования Swift. Начиная с Xcode 8 это не так. Swift 3 представляет множество изменений и значительная часть этих изменений разрушает ваш проект, написанный на Swift 2.2 в Xcode 7.

К счастью, Xcode 8 позволяет сделать определенные установки проекта для того, чтобы оставаться с Swift 2.3, который практически совпадает с версией Swift 2.2 в Xcode 7. Это делается для тех проектов, которые не готовы моментально перейти на Swift 3. И это очень мудрое решение.

Apple обеспечила автоматическую миграцию в Xcode 8 проектов, разработанных в Xcode 7. При этом вас спрашивают, какую версию Swift вы выбираете при этой автоматической миграции: Swift 2.3 или Swift 3.0.

В Xcode 8 вы можете разрабатывать приложения для iOS 8, iOS 9 и iOS 10. Эти приложения могут работать с приборами (и соответственно симуляторами) начиная с iPhone 5 и выше, iPad Air  и выше, и iPad Pro (9,7 дюйма)  и выше.

Поскольку все демонстрационные примеры в нашем курсе  «Developing iOS 9 Apps with Swift» были выполнены  с применением  Xcode 7 и Swift 2.2, то логично перевести их в Swift 2.3 в Xcode 8, что и было сделано, все они находятся в Github и работают прекрасно. Кроме того, в ваше распоряжение предоставляются решения Заданий этого курса в Swift 2.3 в Xcode 8, которые находятся на Github.

Но если вы обновились до Xcode 8 и у вас есть хоть какой-то опыт программирования, то я рекомендую начать изучать курс сразу в Swift 3, так как демонстрационные приложения претерпели очень незначительные синтаксические изменения, не затрагивающие их смысловой характер. Кроме того, в вашем распоряжении Swift 3 версия всех демонстрационных примеров, находящаяся на Github. Кроме того, в ваше распоряжение предоставляются решения Заданий этого курса в Swift 2.3 в Xcode 8, которые находятся на Github.

Давайте более подробно рассмотрим оба варианта:  оставаться ли на Swift 2.3  или сразу работать на Swift 3. А вы, на основании этой информации, сами примите решение.

Читать далее