macro use `dispatch_once` instead of `if` statement