In UIKit MVC, models represent data and rules, views display content and receive interaction, and view controllers coordinate between them. UIViewController is already a framework controller with lifecycle and containment responsibilities; it does not need to become the networking client, decoder, database, analytics service, formatter, and router as well.
Massive view controllers grow through convenience. A new request is started in viewDidLoad, JSON is decoded beside table code, validation appears in a button action, and navigation construction spreads across callbacks. Each addition looks small, but unrelated reasons to change accumulate in one stateful object that is difficult to test or reuse.
Refactor around responsibilities, not line count. Extract domain rules into values or use cases, data access behind a focused dependency, formatting into pure collaborators, and complex route construction into a coordinator. Keep screen-specific orchestration in the controller. A small static screen may need nothing more—architecture should reduce cognitive load, not maximize type count.