Well, I believe the problem is more widespread than you give it credit for. Especially because of Apple and its inability to put forth any guidance. The problem is there, or else we wouldn't see such perforation of this style and these framework among such a large audience or such major players.
Apple is essentially encourage dumping as much code into the controller and sorting it out, without giving much advice on splitting logic out from the interactive bits. If you take things like the Stanford course (or really anything much more encompassing than the basic/Apple material), they encourage usage of logical blocks, but its very hard to adapt to that pattern from circumstances. It's also untestable. Like seriously, untestable. That kills because a rickety app is
hella bad and states change outside of your apps control. There is just no real way you can mock a highly complex VC when it is offloading logic tasks and controlling the UI. MVVM offers a nice break between those two highly independent functions.
And that's the one reason I particularly like MVVM. It tends to split the logic that glues the model to the controller into independent pieces that actually make ends (especially controller) testable by allowing you to feed a predisposed mock-object to get expected results versus the standard MVC approach, which
requires you to mock into the controller and model itself. Similar to your point on the Massive VC Issue, I think if you're MVVMs are dumping grounds, then there is logic that can be split into more reusable logical blocks that do those independent tasks. I find the approach better because it has more structure, but it any concept only goes as far as the developer takes it.
As far as delegates go, a good example of the strength of the MVVM pattern is that I can easily couple my controlling view functionality (view controller, haha) with the controller instead of splitting it into another logical block that adopts the UITableViewDataSource. For more reusable table views, I'm willing to move that into my MVVM, but more often than not I don't need to.
I particularly like RAC because it eliminates so much logic that goes into breaking apart functions and unifies them with a central theme. I hate
switch and
if statements or building an independent logical class to figure out how to handle the response from one of many pickers on screen. I also am glad to see the unification of target-action. There's just too many ways objects can respond which contributes to the Massive VC issue.
In reality though, especially from the situation I described above, you're going to have function that floats around. My goal is always to encapsulate it in ways that are reusable and if I find my self copy and pasting, then something is wrong with what I'm doing. And of course, MVVM isn't written in stone, adopting to conditions is what makes a grand programmer
It was this blog that got my particularly interested in MVVM and RAC (mind you, the RAC stuff is out of date but the concept still exists).