WaitProperty is used to look for change in an existing object's property states. I.E. for the "enabled" property to change from false to true. It relies on the default object sync method to determine if the object exists, so you should really determine this before using WaitProperty. Otherwise your 1000ms timeout could really take up to 21 seconds. 20 seconds for the default object sync timeout, and then 1 second to check to see if the "Signin" property was equal to "SignI"
Exist does just what it says, checks to see if the object(as you defined it in OR or DP definition) exists. It will bypass the default object sync value and only wait for 1 second.
In my experience WaitProperty is rarely needed as you can just add the property changes you are waiting on into the Object Definition and use .Exist. Presuming that you will never use the object in any other state. In any case for best practice you should always use WaitProperty after a .Exist call.