Вопрос проверяет понимание владения зависимостями, жизненного цикла сервисов и стабильности асинхронных операций.
Если сервис создается как локальная переменная, он может быть деаллоцирован сразу после выхода из метода. Это приведет к отмене запросов или потере callback-ов. Хранение сервиса как property гарантирует, что он живет столько же, сколько и владеющий объект. Это делает асинхронные операции предсказуемыми. Такой подход является стандартной практикой.
Жизненный цикл сервиса напрямую влияет на корректность асинхронной работы.
Рассмотрим пример:
func loadData() {
let service = NetworkService()
service.fetch { result in
// callback
}
}
После выхода из loadData:
service теряет все сильные ссылки
ARC может освободить объект
запрос может быть отменен или завершиться некорректно
Это поведение зависит от реализации сервиса, но риск всегда есть.
Если сервис хранится как свойство:
final class ViewModel {
private let service = NetworkService()
}
Тогда:
сервис живет столько же, сколько и ViewModel
асинхронные запросы стабильны
callback-и гарантированно дойдут
Это делает код предсказуемым и проще для отладки.
Хранение сервиса как property также дает:
повторное использование сервиса
возможность отмены запросов
удобство тестирования (через DI)
Редкие случаи:
синхронная логика
stateless-утилиты
фабрики без асинхронности
Для сетевых сервисов это почти никогда не подходит.
Сетевой сервис должен жить дольше, чем метод, который его использует. Хранение сервиса как property гарантирует корректный жизненный цикл, стабильные асинхронные операции и упрощает архитектуру. Локальная переменная для сервиса — частый источник трудноуловимых багов.