Client functions or RepNotifies for general replication?

Hello, i’ve been having some problems in trying to figure out what is Epic’s way for handling general replication in UE 4. Currently i’m using the “Client function” paradigm and i’ve been using this for everything i need to Replicate that is more complex than a variable replication. Example of this paradigm for equipping a weapon:

void OnPressedEquipKey()
{
     AWeapon * WeaponToEquip = GetWeaponToEquip();

     ServerEquipWeapon(WeaponToEquip);
}

void ServerEquipWeapon(AWeapon * Weapon)
{
    StartEquippingWeapon(Weapon);

    ClientStartEquippingWeapon(Weapon); // Multicast to make clients do the same logic
}

void ClientEquipWeapon(AWeapon * Weapon)
{
    StartEquippingWeapon(Weapon);
}

void StartEquippingWeapon(AWeapon * Weapon)
{
     PendingWeapon = Weapon;
     PendingWeapon ->AttachRootComponentTo(Mesh, "RightHand", EAttachLocation::SnapToTarget);

     float Duration = 0.1f;

	if (EquipAnimMontage != NULL)
		Duration = FMath::Max<float>(PlayAnimMontage(EquipAnimMontage ), 0.1f);

	GetWorldTimerManager().SetTimer(this, &AMyCharacter::FinishedEquippingWeapons, Duration);
}

void FinishedEquippingWeapons()
{
      CurrentWeapon = PendingWeapon;
      PendingWeapon = NULL;
}

I’m using this for unequipping, reloading, dropping picking up items and so on. Is this the way to go to in terms of intended flow and performance? I’ve tried doing some code organization and tried to put ClientStartEquippingWeapon() inside StartEquippingWeapon if the Role < ROLE_Authority, but it appears that Client functions are executed on the client with ROLE_Authority so i can’t do this. The only way would be to do something like ShooterGame where the method has the bool bFromReplication parameter to differentiate manually whether we want to call ClientStartEquippingWeapon() or not.

There is also the RepNotify paradigm:

 void OnPressedEquipKey()
 {
      AWeapon * WeaponToEquip = GetWeaponToEquip();
 
      ServerEquipWeapon(WeaponToEquip);
 }
 
 void ServerEquipWeapon(AWeapon * Weapon)
 {
     StartEquippingWeapon(Weapon);
 }
 
 void OnRep_IsEquipping()
 {
     if(bIsEquipping)
          StartEquippingWeapon(Weapon);   // Weapon comes replicated from the server
     else FinishedEquippingWeapons();
 }
 
 void StartEquippingWeapon(AWeapon * Weapon)
 {
     bIsEquipping = true;

      PendingWeapon = Weapon;
      PendingWeapon ->AttachRootComponentTo(Mesh, "RightHand", EAttachLocation::SnapToTarget);
 
      float Duration = 0.1f;
 
     if (EquipAnimMontage != NULL)
         Duration = FMath::Max<float>(PlayAnimMontage(EquipAnimMontage ), 0.1f);
 
     GetWorldTimerManager().SetTimer(this, &AMyCharacter::FinishedEquippingWeapons, Duration);
 }
 
 void FinishedEquippingWeapons()
 {
       bIsEquipping = false;
       CurrentWeapon = PendingWeapon;
       PendingWeapon = NULL;
 }

RepNotifies run on the ROLE_Autonomous instead of the ROLE_Authority from Client functions and looks lighter in performance, but they need the dependent variables to be correctly replicated. Are all variables replicated first and then the repnotifies are called or the repnotify is called after assigning the value for that variable (this is more dangerous because when we’re running the RepNotify it might try to access variables that haven’t been updated yet).

I apologize for the lengthy code, just trying to figure out when to use Client functions and RepNotify. Thank you.