I came across a situation where multiple threads were attempting to display a loading view. This was sometimes causing race conditions.
Enter synchronization. This article does a great job of explaining various techniques for performing synchronization.
Because I was working with with UI components, this is the pattern I eventually settled on. If you have a different or better way to do it, let me know!
Step 1: Create a dispatch_queue_t data member
dispatch_queue_t _lock;
_lock = dispatch_queue_create("my.app.lockqueue", nil);
Step 2: Use the dispatch queue to serialize calls to the code:
// dispatch on lock queue to serialize request
dispatch_async(_lock, ^{
// dispatch sync on main queue to perform UI activity
dispatch_sync(dispatch_get_main_queue(), ^{
//
// do some stuff with UI
//
});
});