Где мы должны использовать «Task {}»: в ViewModel или ViewController?

Предположим, у нас есть некоторый асинхронный код. В какой-то момент мы должны обернуть его в Task {…}, чтобы запустить его из синхронного контекста. Так где же канонический способ сделать это? ViewModel или ViewController?

Если мы обернем его с помощью Task {…} в ViewModel, функции ViewModel станут эффективно синхронными, и вызов их из ViewController по-прежнему потребует всех этих танцев завершения/делегатов/замыканий/RX для выполнения некоторых обновлений пользовательского интерфейса после завершения асинхронной работы.

С другой стороны, если мы пометим ViewModel функции как async и вызовем их из ViewController внутри Task {…} тела, это, похоже, решит проблему. Так это путь?

Отвечает ли это на ваш вопрос? Как использовать асинхронность и ожидание для функции по умолчанию?

lorem ipsum 19.06.2023 14:14

Это кажется мне совсем другим вопросом. Вопрос не в том, как вызвать функцию async из синхронной, а в том, где (то есть в контроллере представления или в модели представления).

Rob 19.06.2023 14:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы не стал повторно вводить устаревшие шаблоны завершения (замыкания, делегаты и т. д.). Это противоречит цели параллелизма Swift — изящному управлению асинхронными зависимостями. Например, в видеоролике Параллелизм Swift: обновление примера приложения на WWDC 2021 показаны примеры того, как мы устраняем обработчики завершения с помощью параллелизма Swift.

Итак, обозначим методы модели асинхронного представления как async. Затем контроллер представления будет использовать Task {…} для входа в асинхронный контекст параллелизма Swift, чтобы он мог await использовать метод async модели представления, а затем запускать обновление пользовательского интерфейса, когда оно будет выполнено.

Но использование Task {…} не ограничивается контроллером представления. Модель представления также может использовать его (например, когда нужно сохранить задачу, чтобы по какой-то причине отменить ее позже).

Но ты спрашиваешь:

если мы пометим ViewModel функции как async и вызовем их из ViewController внутри Task {…} тела, это, похоже, решит проблему. Так это путь?

Именно так. Если метод действительно делает что-то асинхронное, пометьте его как async, и контроллер представления вызовет его из Task {…}.


При всем при этом в проектах SwiftUI, где модель представления часто передает обновления в представление с помощью свойств ObservableObject и @Published, я бы остался в пределах этого интуитивно понятного и естественного шаблона. В этот момент, когда вы решите перейти в асинхронный контекст, становится немного менее убедительным/критичным.

Тем не менее, с точки зрения тестируемости, вы все равно хотите знать, когда асинхронная задача модели представления выполнена, поэтому я, вероятно, все равно сделаю методы модели представления async.

Другие вопросы по теме