##XXAppDelegate.m, XXSomeView.m, some other object, etc##
...
[[XXSomeSingletonController sharedInstance] doThatThing];
...
##XXSomeSingletonControllerObserver.h##
@protocol XXSomeSingletonControllerObserver <NSObject>
- (void)didFinishThatThing;
@end
##XXSomeSingletonController.m##
- (void)doThatThing
{
... // this was the method we first called from XXAppDelegate, XXSomeView, etc
}
- (void)finishDoingThatThing
{
[self.observers enumerateObjectsUsingBlock:^(id<XXSomeSingletonControllerObserver> observer, BOOL *stop) {
if([observer respondsToSelector:@selector(didFinishThatThing)])
[observer didFinishThatThing];
}];
}
##XXViewController.m##
@interface XXViewController () <XXSomeSingletonControllerObserver>
@end
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[XXSomeSingletonController sharedInstance] addObserver:self];
}
- (void)didFinishThatThing
{
<#code to handle finishing the Thing#>
}