Посвящается оптимистичным владельцам продуктов и разработчикам во всем мире…

Я уже давно собирался поиграться со Swift и XCode и, наконец, на прошлой неделе приступил к делу.
Этот опыт не только научил меня использовать XCode и Swift, но и оказал на меня большее влияние. , так как это дало мне мощный пример важного урока о доставке продуктов.

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

Создание iOS-приложения менее чем за день

Все началось с того, что я решил пройти курс Udacity Введение в разработку iOS-приложений на Swift, чтобы наконец-то запачкать руки.

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

С помощью курса я смог создать следующее приложение менее чем за день:

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

Тривиальное изменение удвоило мои усилия по разработке

При создании пользовательского интерфейса я решил немного отклониться от материала курса и хотел внести в него небольшую корректировку.

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

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

Сработало мое ОКР, и я решил исправить это поведение, отобразив кнопку остановки для пользователя только во время воспроизведения звука.

Я особо об этом не думал, потому что моя оптимистичная сторона говорила:
«это займет всего пару минут», но мой оптимистичный взгляд был неправ…

Скрытие кнопки остановки

Во-первых, я сделал кнопку остановки скрытой по умолчанию и сделал ее видимой только в начале моей функции воспроизведения, которая вызывалась при нажатии одной из кнопок эффекта.

Затем мне нужно было снова скрыть его, когда воспроизведение закончилось.
В тот момент я воспроизводил звук с помощью компонента Apple с именем AVAudioPlayer, поэтому я обнаружил, что вы можете передать делегат с функцией, которую AVAudioPlayer вызывает, когда воспроизведение заканчивается.

Для тех, кто хоть смутно понял, о чем я говорю, я серьезно рекомендую продолжить чтение этого поста в моем блоге, где я погружаюсь глубже с техническими пояснениями и делюсь своими примерами кода),
Для тех, кто не понял т., вот что важно:

Бум! Проблема решена. Это было легко и заняло менее десяти минут; Я глажу себя по спине и возобновляю тренировку следующим видеосеансом.

Скрытие кнопки остановки… эээ… опять…

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

Требования меняются, и нам нужно заменить текущий компонент AVAudioPlayer на более продвинутый с именем AVAudioEngine для воспроизведения звуков на iOS, потому что это единственный компонент, который поддерживает изменение высоты тона.

У этого компонента нет делегата, как у последнего, но когда вы вызываете функцию, которая воспроизводит файл, вы можете указать ей запустить другую функцию обратного вызова после окончания воспроизведения звука, поэтому я переписываю код и передаю функцию, которая скрывает кнопку остановки…

это не работает !!!
(и эта кнопка остановки тоже начинает меня сильно раздражать)

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

Это распространенная парадигма разработки пользовательского интерфейса во многих других языках программирования, поэтому я довольно быстро с ней разобрался, но начинающий разработчик может легко потратить на это дни. ¯\_(ツ)_/¯

Я исправил и эту проблему…
все равно не работает ! ! !

Сообщение об ошибке в Apple

Я провел некоторое тестирование и увидел, что моя функция для скрытия кнопки остановки вызывается сразу же при начале воспроизведения записи (а не в конце записи, как указано в документации Apple). меня).

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

Я ни за что не откажусь от того, чтобы скрыть кнопку остановки! это самое важное (и единственное) приложение для IOS, которое я когда-либо создавал (к тому же, к настоящему моменту у меня появилась враждебность к этой кнопке).
Я собираюсь заняться этим, как это делают хорошие разработчики; Я найду обходной путь!

Поиск обходного пути

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

ЭТО РАБОТАЕТ! ! !
(и я тоже прошла курс!)

…но сага продолжается…

Промежуточные среды работают, рабочие падают и горят

Чувствуя гордость, я схватил iPhone 6 моей жены и развернул свое новое приложение на первом реальном устройстве; Я пробую эффект Дарта Вейдера, и он сразу же вылетает.

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

ЭТО РАБОТАЕТ! ! !

Отношения любви и ненависти, которые у меня были с кнопкой «Стоп», заставляют меня снова и снова тестировать запись.

Исправление еще одной ошибки

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

последствия

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

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

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

Я легко вижу, как настоящие команды разработчиков и владельцев продукта могут потерять из виду реальную тривиальную функцию с одним или несколькими побочными эффектами, подобными тому, что я испытал здесь, и, помня обо всем этом, я оставляю вас с мой вывод:

Отправляя продукт, научитесь говорить «нет».
Даже самым мелким тривиальным функциям, если они не являются существенными;
Когда это необходимо, оставьте их на потом, так как вы никогда не знаете, сколько времени они на самом деле будут стоить.

  • Они отвлекают ваше внимание от поставленной цели.
  • Они могут занять больше времени, чем планировалось.
  • Вероятно, в них есть ошибки, о которых вы узнаете позже.
  • Изменения требований могут нарушить их.
  • У них есть потенциал, чтобы убить ваш продукт в производстве.

PS
Если вы хотите чему-то научиться, никогда не сдавайтесь и никогда не оставайтесь на пути… то есть, если только вы не думаете о том, чтобы скрыть кнопку остановки в второй взгляд на Udacity Введение в разработку iOS-приложений на Swift, в таком случае — просто не надо.