As a potential consumer of this API, this pattern seems unexpected. Any way to make it clearer?

Is this method actually being called from both the main thread and other threads? If called from the main thread, does it have to be executed synchronously like that, or could it still be dispatched asynchronously?

If it can be changed to always execute asynchronously, the API could be changed to be more clear (e.g. by adding an optional completion handler and documenting it).