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];
If you're on 10.6, you can also use setCompletionBlock:. It's used like this:
For general introduction on blocks and GCD, this article was extremely helpful. I found GCD & setCompletionBlock easier to read than NSNotification. One caveat is, well, it only runs on 10.6!
You can use
performSelectorOnMainThread:withObject:waitUntilDone:
with using a helper method, in a similar fashion to the following example.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.
Update: Dispatch queues make posting a notification on the main thread very easy.
To wait for the notification handlers to finish, just replace dispatch_async with dispatch_sync.
Following notnoop's answer, here's some infrastructure you can use to safely post your notifications on the main thread without waiting for them to finish. Hopefully someone will find this helpful!
NSNotificationCenter+Utils.h:
NSNotificationCenter+Utils.m:
NSInvocation+Utils.h:
NSInvocation+Utils.m:
To expand on Danra's answer here's the ARC compliant version of the category I put together:
NSNotificationCenter+Threads.h
NSNotificationCenter+Threads.m