If the API contract says you can't pass a nil block, then enforce it with an assertion. By returning nil the user of this class might thing just "not enough time has passed" and it will fail silently.
Passing a nil name would also make the NSMutableDictionary method crash, so it's better to crash early to let the user of this class know what they did wrong.
Creating the dictionary the first time the class is used. No need to add a dispatch_once with a lock every time the dictionary is required.
Making the class thread-safe, allowing you to call the public methods from different queues safely, removing the race conditions.