Best Practices for managing order of spawning for dependent objects?

Hi all.

Context:

In game there is a lot of objects dependent on each other. An example would be UI displaying players life and the player pawn itself. You need to bind the UI values to the player pawn. One of the simplest approaches can be simply save a reference to the actor you are dependent on and read/update values in Tick method. Anothee approach (the better one I would say) is to connect those objects in a event driven way. The dependent object would bind its events to an another event of an another object.

Problem:

When you try to do this in BeginPlay method (which is automatically called by the engine) the order of spawning actors is not determined so you can get NULL reference when trying to get actor reference. Another case can be that the actor is already spawned so you dont get NULL reference but the actor has not finished his data preparation (e.g. reading config assets and setting up variables in its own BeginPlay method) so the data you read from the actor are not consistent and set up correctly.

Possible bad solutions:

One solution that comes in mind is to let those big independent objects spawn the dependent ones. This would solve the spawn order issue but would also breaks the Cohesion of your classes.

Another solution is to get your data and bind your events in the Tick function. You can add a bool check to ensure it happens only once per actor. When Tick method runs every actor defined in level should be spawned already so no NULL reference should occurre and the data should also be set up.

Final question:

Are there any best practices regarding this topic used in production?
How to manage the correct order of spawning dependent objects?
Is there any abstract framework you can apply to ensure the correct spawn order?

Sorry for a long post.