I don’t.
I never return row or view or iterator objects to the client. I only return what the client needs, so I’m sure there is only one round trip and all and only the data I need is transferred.
If you look at the AutoScroll custom component you see how I manage the lazy loading. (In this simple example I break the rule and do return a list of row objects rather than dictionaries, but yeah, this is just a simple example).
The downside: is not automatic and you need to take care of everything (not really complex).
The upside: you have the control and you are 100% sure you don’t get sneaky round trips slowing you down, or other problems with large data.