Лекция 9 CS193P Winter 2015 — Scroll View и Многопоточность (Multithreading)

Лекция 9 начинается с дополнительной информации о том, как управлять появлением отдельных элементов пользовательского интерфейса в различных Size Classes и как инспектировать ограничения (constraints) в различных Size Classes.

Scroll Views

Пол Хэгерти демонстрирует работу Scroll View, показывает как добавить subviews к Scroll View, как установить контентную область для прокрутки  и какие действия небходимо выполнить, чтобы  Scroll View заработал. Профессор подробно рассказывает о методах, с помощью которых можно определить, какая часть контентной области видна в данный момент времени, как управлять прокруткой программным образом и т.д.

Особое внимание уделяется масштабированию содержимого контентной области и применению делегата UIScrollViewDelegate, который опирается на протоколы старого Objective-C  стиля. Этот стиль протокола позволяет иметь необязательные (optional) методы. В протоколах нового Swift стиля нет необязательных (optional) методов. В Лекции 9 Пол Хэгерти указывает, какие методы делегата задействованы в масштабирование. Масштабирование также можно выполнять программным образом.

Замыкания

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

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

Многопоточность

Для того, чтобы избежать блокировки взаимодействия пользователя с приложением, ресурсоемкие работы должны выполняться в других очередях, отличных от main queue (главной очереди).  Очередь main queue должна оставаться свободной для UI. При получения  данных в других очередях, для корректировки UI (если это необходимо), нужно опять вернуться в main queue.

Современные методы многопоточного программирования немного тяжеловаты для нашего воображения. Дело в том, что некоторые вещи в многопоточном программировании осуществляются в другом порядке, так как они выполняются в разных потоках. Как с этим справиться показано на примере многопоточного приложения Cassini.

Лекция и слайды на английском языке iTunes название “9. Scroll View and Multithreading.”.  Код для Демо «Cassini» Для Swift 1.2 доступен на  Stanford

Для Swift 2.0 и Xcode 7 код демонстрационного примера «Cassini» находится здесь.

Русский неавторизованный конспект лекции , хронометрированный через каждые 5 минут, представлен в PDF — файлах, которые доступы на платной основе.

Дополнение к Лекция 2 — особенности кода Calculator в Swift 1.2 и Swift 2.0 или как не «застрять» на этом месте

Если вы приступаете к изучению  Лекции 2 (1-ая часть, 2-ая часть и 3-я часть) с загруженными Swift 1.2  и Xcode 6.3, а не Swift 1.1  и Xcode 6.2, как у профессора Пола Хэгерти, то ближе к концу лекции (конец 2-ой части) вы получите ошибку, которой у профессора нет. Это может сильно «притормозить» ваш процесс обучения.  Для того, чтобы этого не произошло, я расскажу, чем отличается ситуация, которую демонстрирует профессор, в Swift 1.1 и в Swift 1.2. Профессор Пола Хэгерти хочет показать такую возможность  Swift как перегрузка (overloading) функций с одинаковыми именами на примере функций performOperation для операций с одним и двумя аргументами

Screen Shot 2015-02-03 at 2.29.20 PM
Его «задумка» в Swift 1.1 сработает, и он не получит никакой ошибки, а вы в Swift 1.2 — получите ошибку

 Method 'perform' with Objective-C selector 'perform: ' conflicts with previous declaration with the same Objective-C selector

которая говорит о том, что «Метод perform c Objective-C селектором perform: конфликтует с предыдущим определением того же самого Objective-C селектора».

Читать далее

Задание 3. Решение — дополнительные пункты 4, 5 и 6. Окончание.

Screen Shot 2015-05-12 at 8.50.24 PM

Это решение Задания 3 — дополнительные пункты 4, 5 и 6. Обязательные пункты Задания, дополнительные пункты 1, 2 и 3, а также ссылки на текст самого Задания 3 можно посмотреть здесь:

Задание 3. Решение — обязательные пункты.
Задание 3. Решение — дополнительные пункты 1, 2 и 3.

Для окончательного решения код для Swift 1.2 находится на Github. Для Swift 2.0 код можно посмотреть на Github.

Читать далее

Задание 3. Решение — дополнительные пункты 1, 2 и 3

Screen Shot 2015-05-10 at 9.35.51 PM

Это решение Задания 3 — дополнительные пункты 1, 2 и 3. Обязательные пункты Задания, а также ссылки на текст самого Задания 3 можно посмотреть:

Задание 3. Решение — обязательные пункты.

Для данного поста код для Swift 1.2 находится на Github. Полное решение для Swift 2.0 можно посмотреть на Github.

Пункт 1 дополнительный

Поймите, как работают Instruments,  анализируя производительность жестов  panning и pinching в вашем графическом View. Что делает перемещение графика по экрану таким “вялым”? Объясните в комментариях к вашему коду, что вы обнаружили и что с этим можно сделать.

Вместо запуска приложения запускаем Instruments для приложения с помощью  ⌘I и выбираем Time Profiler.
Screen Shot 2015-05-08 at 8.28.15 PM
Читать далее

Задание 3. Решение — обязательные пункты

Screen Shot 2015-05-16 at 9.24.07 AM

Текст Домашнего задания на английском языке доступен на  iTunes в пункте “Developing iOS 8 app: Programming: Project 3″.  Текст Домашнего задания на русском  языке доступен на 

Задание 3 iOS 8_new.pdf


Для выполнения этого Задания необходимо освоение  Лекции 5Лекции 6Лекции 7 и Лекции 8.
В подсказке 4 Задания 3 предлагается некоторая методика разработки данного приложения, но каждый волен сам выбирать, какую часть приложения создавать в первую очередь. Поэтому обязательные пункты Задания 3 могут выполняться не в строгом порядке.

Код для Swift 1.2 находится на Github. Полное решение для Swift 2.0 можно посмотреть на Github.

Читать далее

Дополнение к Лекции 8: как скрыть клавиатуру после ввода текста.

Если вам нужен ввод текста в Swift приложении, то вы помещаете текстовое поле Text Field на пользовательский интерфейс. Когда пользователь кликнет на этом поле, появится клавиатура из нижней части экрана, позволяя пользователю начать набор текста. Многие думают, что клавиатура должна «скрыться», когда пользователь закончит печатать. Хотя это, конечно, правильно, но это не единственная причина «скрыть» клавиатуру. Более правильно думать о том, что клавиатура должна «скрыться», когда пользователь перестал взаимодействовать с ней. Например, когда он «тапнет» (tap) на кнопке, коснется чего-то на экране за пределами текстового поля или будет скроллить Table View. Таких ситуаций много, поэтому указание клавиатуре — «скрыться», отдано в iOS на откуп разработчику.
Распространенной ошибкой многих начинающих iOS программистов является незнание того, что этап «скрытия» клавиатуры не встроен в логику работу с текстовым полем Text Field.  Если вы кликните на текстовом поле Text Field, а затем попытаетесь кликнуть где-нибудь еще…. то ничего не происходит: клавиатура остается на экране и блокирует весь пользовательский интерфейс. В этом посте мы постараемся это исправить.
Мы узнаем как и где «скрыть» клавиатуру в iOS 8, используя Swift.

Читать далее

Лекция 8 CS193P Winter 2015 — «Жизненный цикл» View Controller, Автоматическая разметка (Autolayout)

В Лекции 8 рассматриваются две главные темы. Первая тема — это  “жизненный цикл” View Controller, то есть как View Controller рождается, живет, делает много интересных дел и затем умирает. Профессор подробно рассказывает нам о всех этапах жизни View Controller и о том, какие сообщения посылает ему система на протяжении его «жизненного цикла».  Он начинает с момента создания View Controller, затем следует подготовка View Controller для того случая, когда к этому View Controller кто-то “переезжает”  (segue). Следующий этап — установка ваших outlets, затем ваш View Controller появляется (appear) на экране и может исчезнуть (disappear), и может опять появиться, и опять исчезнуть.  Затем его геометрия может быть изменена , например, при автоматическом вращении (autorotation) прибора или еще по каким-то другим причинам.  В некоторых неочевидных случаях может иметь место ситуация нехватки памяти на вашем устройстве, и система может вовлечь вас в решение этой проблемы.

Он не просто перечисляет такие методы «жизненного цикла» View Controller, как viewDidLoadviewWillAppear и viewDidAppearviewWillDisappear и viewDidDisappear, viewWillLayoutSubviews и viewDidLayoutSubviews,
viewWillTransitionToSize и другие, но также очень подробно рассказывает о том, в каких ситуациях их нужно применять, а в каких воздержаться от их использования.

Читать далее

Как создать NSNumberFormatter Singleton в Swift (1.2 и 1.1) — дополнение к Заданию 2

Мне было необходимо использовать класс NSNumberFormatter для изменения вида представления числа в  моем  CalculatorBrain в Задании 2 стэнфордского курса «Разработка iOS 8 приложений на Swift. Winter 2015», например, с 2324.00 на 2 324 без десятичных знаков, то есть придать универсальному NSNumberFormatter некоторую нужную мне конфигурацию. Из-за того, что инициализация NSNumberFormatter может быть экстремально дорогой операцией в iOS, способной «поставить на колени» отдельные приложения, не хотелось бы, чтобы производительность приложения зависела от этого, особенно если используется одна и та же конфигурацию  NSNumberFormatter всюду в моем приложении. Будем использовать Singleton ( синглтон ) — ровно один экземпляр некоторого класса, глобально  доступный всем клиентам.

Singleton (синглтон) — это популярный паттерн (шаблон ) проектирования. Если вы новичок в Swift, вам будет интересно, как можно в Swift создать Singleton. В Objective-C, возможно, вы уже пробовали для создания синглтона dispatch_once из Grand Central Dispatch.

В настоящее время существует прекрасный пост в  stack overflow, в котором рассматриваются все пути создания Singleton в Swift, хотя этот пост не снабжен каким-то «глубоким» практическим примером. Класс  NSNumberFormatter широко используется и пример использования Singletons в классе  NSNumberFormatter будет очень полезен.

Читать далее

Дополнение к Лекции 7: Изменение адаптивности Popover в iOS 8.3

Эта тема важна для Лекции 7, в которой рассматривается Popover для iPhone и iPad, и для демонстрационного примера «Psychologist Popover«, который доступен на сайте  Stanford. Этот демонстрационный пример в части Popover  на iPhone будет работать в iOS 8.3 не так, как планировалось. Вариант исправленного демонстрационного примера «Psychologist Popover« для iOS 8.3 доступен на  Github. Ниже дается пояснение проблемы.

Адаптивность до  iOS 8.3

Само по себе Popover — не UIViewController. Он появляется на экране, используя так называемый механизм Presentation Controller. Popover на iPad “всплывает” так, как вы видели на рисунке выше для iOS 8.2. В виде маленького окошка со стрелкой. На iPhone Popover адаптируется и превращается вместо маленького окошка в модальное окно на полный экран. Оно не “всплывает” как что-то маленькое на iPhone. Что касается iPhone 6 Plus, то в портретном режиме он ведет себя как iPhone ( модальное окно на весь экран), а в ландшафтном режиме как iPad ( маленькое «всплывающее» окно). Такая Адаптация делается автоматически. iOS 8 автоматически делает эту адаптацию также, как автоматически адаптируется Split View и Navigation Controller для iPhone.
Перед iOS 8.3, Адаптивность Popover работала, когда горизонтальный size class изменяется от Regular к Compact.

Читать далее

Вышла версия Swift 1.2 : долгожданные изменения.

Screen Shot 2015-04-12 at 10.28.29 AM

;

 

Версия Swift 1.2.принесла очень существенные и долгожданные изменения языка Swift :

инкрементная компиляция. Это означает, что файлы с исходным кодом, которые не были изменены, больше не будут заново компилироваться по умолчанию,что значительно  уменьшит время  компиляции

— улучшенные сообщения об ошибках и повышение стабильности в Xcode

— “static” методы и свойства ( properties) теперь разрешены в classes (как псевдоним для “class final”). Теперь вам разрешается декларировать как «static» хранимые свойства (stored properties) в  classes, которые сохраняются глобально и  lazily инициализируются при первом доступе (то есть как глобальные переменные).

Screen Shot 2015-04-13 at 4.00.39 PM
Теперь очень легко создавать Singletons — буквально одной строкой кода.

Screen Shot 2015-04-18 at 5.13.34 PM

— в протоколах (Protocols) теперь требуется декларировать тип как “static” вместо “class

— появился новый тип  Set, который является взаимозаменяемым (bridging) с Objective-C классом  NSSet, также, как и  String, Array и Dictionary — взаимозаменяемы ( bridging) с их соответствующими  Objective-C классами. Вы можете делать с Set в Swift все, что вы ожидаете делать с множествами вообще: проверять принадлежность значения к множеству, перечислять все элементы множества, выполнять операции union и intersect и т.д. Это существенное дополнения в стандартную библиотеку, которое закрыло огромную абстрактную «дыру», так как   NSSet не чувствовал себя комфортно в Swift

Screen Shot 2015-04-12 at 4.45.14 PM
Screen Shot 2015-04-12 at 4.52.51 PMЖдем того же от  NSDate и других.

— изменен глобальный метод countElements на count

-приоритет (precedence) оператора ?? повышен, чтобы привязать его более жестко, чем логические операции и операции сравнения, но ниже, чем преобразование и операторы диапазона ( range). Это обеспечивает более полезное поведение выражений подобных этому:

Screen Shot 2015-04-13 at 4.03.09 PM

Читать далее