У этого тестового сервера похоже есть лимит на кол-во запросов, о котором не сказано ни в одной документации: если повесить автотесты на совершение каких-то покупок, то мы у себя в компании часто нарывались на этот лимит, и у нас просто сервер Apple на Sandbox переставал нам отвечать, а мы долго и мучительно пытались понять что мы делаем не так.
Testing auto-renewable subscriptions
Duration times are shortened when test your auto-renewable subscriptions. Additionally, test subscriptions only auto-renew a maximum of six times. help.apple.com/app-store-connect/#/dev7e89e149d
Спасибо, есть над чем задуматься. Хотя, дизайнеры скорее предпочтут кастомный вью стандартному алерту, с точки зрения хотя бы эстетики. Другое дело, что разработчикам проще использовать алерт и, возможно, это они когда-то убедили дизайнеров, что это по гайду )
Спасибо, забавно. Только в 4 примере не «держит ссылку даже после окончания “срока службы” исходного массива», а ссылается на другой array в стеке, т.к. это value type.
В методе делегата все-таки лучше обновлять те данные, которые изменились, а не всю collectionView. Например, так: collectionView.reloadRows(at: [indexPath!], with: .automatic)
Еще можно задействовать методы делегата controllerWillChangeContent и controllerDidChangeContent, в которых выполнить beginUpdates и endUpdates.
Также можно, в зависимости от NSFetchedResultsChangeType, выполнить insertRows, deleteRows или reloadRows.
1. Не обязательно включать очередной pod в проект, достаточно установить SwiftLint локально
2. Пользуйтесь debugPrint вместо print, если он так нужен
3. Большой кусок кода во viewDidLoad на скриншоте так себе code style — лучше разбить на несколько приватных функций по функционалу
p.s.
Про SwiftLint было уже прилично статей на Хабре. Не увидел в статье других «статических анализаторов кода и опыте их применения», как написано в заголовке
Видимо потому, что смотрели не последнюю редакцию книги :)
Цитата:
«Chapter 6. Working with Generics
I received a lot of feedback about protocol-oriented programming after the first version of this book was released. Almost all of this feedback was very positive; however, there was one conversation that I had, with one of the smartest people that I have had the privilege to meet, about what protocol-oriented programming was. One of the comments that he made was that I should not forget about generic programming. The conversation that we had about generic programming really stuck with me and when I had the opportunity to write the new version of this book, I took that opportunity to include this chapter on generics.»
Давайте рассмотрим док-во от противного. Представим, что большинство людей незрячие и все приложения сделаны под Voice Over с доп. функциями для небольшого числа зрячих. Могут ли зрячие ими пользоваться? Безусловно. Удобно ли им, по сравнению с визуальным интерфейсом? Вряд ли (не говоря уже о скорости восприятия информации).
Общее в том, что это все-таки разные интерфейсы, как ни крути. Понятно, что для разработчика это всего лишь фича (а для компании — пиар, чего уж там). Было бы интересно услышать мнение product менеджера. Уверен, здесь поле непаханое, чтобы развернуться и сделать спец. версию. Но бизнесу это не нужно, это да, слишком мала доля ЦА. А нужно ли это ЦА — для этого нужно вначале попробовать.
Если коротко, то причины те же, почему большинство компаний предпочитают нативную разработку под iOS и Android, вместо использования React Native, Flutter, etc. И да, это разные команды и т.д. и т.п.
В демо проекте в ChatViewController почему-то self.chatId = "" вместо self.chatId = chatId. Из-за этого экран Contact 1 создается несколько раз, если тапать на экране Profile по Go to Contact 1.
Testing auto-renewable subscriptions
Duration times are shortened when test your auto-renewable subscriptions. Additionally, test subscriptions only auto-renew a maximum of six times.
help.apple.com/app-store-connect/#/dev7e89e149d
habr.com/ru/company/redmadrobot/blog/352088
В методе делегата все-таки лучше обновлять те данные, которые изменились, а не всю collectionView. Например, так: collectionView.reloadRows(at: [indexPath!], with: .automatic)
Еще можно задействовать методы делегата controllerWillChangeContent и controllerDidChangeContent, в которых выполнить beginUpdates и endUpdates.
Также можно, в зависимости от NSFetchedResultsChangeType, выполнить insertRows, deleteRows или reloadRows.
2. Пользуйтесь debugPrint вместо print, если он так нужен
3. Большой кусок кода во viewDidLoad на скриншоте так себе code style — лучше разбить на несколько приватных функций по функционалу
p.s.
Про SwiftLint было уже прилично статей на Хабре. Не увидел в статье других «статических анализаторов кода и опыте их применения», как написано в заголовке
Цитата:
А почему используете .receive(on: RunLoop.main) вместо .receive(on: DispatchQueue.main)?
yandex.ru/search/?text=приложение%20для%20незрячих&lr=1091
Например, первые же ссылки, там и про заказ еды есть:
www.specialview.org/article/post501
www.specialview.org/article/advice80
AnyObject. И структура всё равно не сможет конформить такой протокол. Из документации:
AnyObject can be used as the concrete type for an instance of any class, class type, or class-only protocol