Site icon AppTractor

Мне кажется, или SwiftUI еще не готов к проду? — обсуждение на Reddit

У меня есть приложение, написанное исключительно на SwiftUI, которое продается в App Store уже 2.5 года. По мере того как мои пользователи хранят в приложении все больше данных, а приложение становится все сложнее и требовательнее, я чувствую, что SwiftUI по-прежнему сильно не хватает в различных областях.

Я не говорю о старых версиях SwiftUI. Я имею ввиду современные версии SwiftUI от iOS 16+, хотя на данный момент SwiftUI уже 5 лет.

Вот некоторые недостатки, которые я заметил за эти годы.

1. Списки в SwiftUI по-прежнему ужасно плохи с точки зрения производительности.

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

Я пробовал использовать id(UUID()), но это ломает анимацию, и улучшение производительности было минимальным.

Ввод списка с 10 тыс. элементов из NavigationStack занимает 2-3 секунды, что неприемлемо с точки зрения производительности. Прежде чем вы спросите, почему я пытаюсь отобразить тысячи элементов в списке, я, по сути, пытаюсь показать множество песен в плейлисте, как это делает Spotify.

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

2. NSFetchedResultsController

Я удивлен, что в SwiftUI до сих пор нет эквивалента этому контроллеру, если только они не анонсировали что-то в WWDC24.

Я пытался использовать UITableView в UIViewRepresentable, используя обертку свойства fetch request, и бам, странная консольная ошибка продолжала выскакивать. Но все ответы на Stack Overflow и комментарии/ответы в сообществе Apple — это просто люди, публикующие случайные исправления, которые сработали для них, и никто не знает причину этого.

3. Природа SwiftUI как «черного ящика» и трудности с поиском ответов

Очень трудно найти ответы на любые ошибки или странные проблемы, которые вы обнаружите в своем приложении на SwiftUI. Многие ответы на Stack Overflow остаются без ответа. Даже если я задам простой вопрос о том, как использовать представления SwiftUI в некоторых частях приложения UIKit, никто ничего не знает, и ответов на ваш вопрос нет. Искать источник ошибок или странного поведения становится очень неприятно, несмотря на то, что SwiftUI на данный момент уже 5 лет.

Похоже, люди до сих пор не знают, что происходит в SwiftUI.

4. Баги в представлениях и неожиданное поведение

В процессе разработки своего приложения в SwiftUI я столкнулся с множеством ошибок. Например, в NavigationSplitView есть проблема с некорректной анимацией строки поиска при переходе к детальному представлению. Она воспроизводиться даже на простом примере. По-прежнему есть проблема случайного сбоя при нажатии на определенную ячейку в списке, которая все еще не исправлена в iOS 17.5.

Либо никто ничего не знает о причине странного сбоя, консольной ошибке. Либо есть тонны и тонны ответов на Stack Overflow, которые являются буквальными халтурными хаками, которые точно сломаются в будущих версиях iOS.

5. Документация Apple по-прежнему ужасающе плоха

В SwiftUI до сих пор не хватает нормальной документации,  а примеры кода для новых API вообще отсутствуют. Никто ничего не знает, а документация бесполезна, что является двойным ударом. В итоге я трачу еще больше времени на пробы и ошибки, когда мог бы написать правильную версию на UIKit.

6. Попытка использовать UITableView вместо списка

Была тема в Apple Docs по этому поводу, и человек из службы поддержки прямо сказал, что команда Apple не будет исправлять проблему в попытке использовать UITableView в SwiftUI и рекомендует использовать List, который в моем случае, как я уже говорил, ужасно плох по производительности для больших наборов данных.

Заключение

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

Меня просто очень удивляет количество комментариев здесь, на Reddit, утверждающих, что SwiftUI готов к работе, когда даже для такого личного приложения, как мое, которое ни в коем случае не является крупным приложением, может возникнуть столько проблем. Возможно, Reddit просто является огромной эхо-камерой.

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

На данный момент я чувствую, что по мере того, как мое приложение растет,  SwiftUI делает простые вещи более простыми, а сложные — еще более сложными. Конечно, на SwiftUI очень приятно писать базовые приложения в стиле самой iOS, но по мере усложнения приложения это становится крайне неприятным. Написание ячеек для табличного представления — это очень здорово, но более сложные части, такие как сами табличные представления, представления коллекций и разделенные представления, просто откровенно непроизводительны или чертовски глючны.

Конечно, Apple может улучшить это в будущем. Но какой в этом смысл, когда мне приходится поддерживать старые версии iOS, и даже на WWDC24 все еще нет никаких решений для всех моих жалоб.

Готов ли SwiftUI к проду

Вот некоторые ответы из этого треда:

Exit mobile version