I would suggest saving it every “logical” chance you get. That is, whenever the data makes a nice, complete set that you can use to re-load your applications state, that’s a good save data point (as opposed to halfway through levels, or halfway through editing settings, etc). Save it when your app is in a good, re-loadable state.
I’m not big on solely relying on saving at the application close event, just because I don’t trust that it will always fire off. If the user exits normally I believe it does, but not so sure if the app crashes (does it still get the event, or can it even deal with the save at that point / is the data corrupted too?), if the battery is removed, or other scenarios.
So I’d recommend saving while the saving is good (at logical points of course). You might lose a half level of data in a catastrophe, but it’s a lot easier than coding your loadData function to be able to handle loading a half done level as well.