Search code examples
iphoneobjective-ccocoansoperationnsnotificationcenter

NSOperation and NSNotificationCenter on the main thread


I have an NSOperation. When it is finished I fire a NSNotificationCenter to let the program know that the NSoperation is finished and to update the gui.

To my understanding listeners to the NSNotification will not run on the main thread because the NSOperation is not on the main thread.

How can I make it so that the listeners run on the main thread when I fire my event?

[[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self]; 

Solution

  • You can use performSelectorOnMainThread:withObject:waitUntilDone: with using a helper method, in a similar fashion to the following example.

    .....
    [self performSelectorOnMainThread:@selector(fireNotification) withObject:nil waitUntilDone:YES];
    ...
    
    - (void)fireNotification {
      [[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self]; 
    }
    

    If you don't wait until being done, you will need to consider the cases where other threads may refer to the object which could be already cleaned up before the main thread gets invoked.