Search code examples
cocoaiosios4grand-central-dispatch

using dispatch_sync in Grand Central Dispatch


Can anyone explain with really clear use cases what the purpose of dispatch_sync in GCD is for? I can't understand where and why I would have to use this.

Thanks!


Solution

  • You use it when you want to execute a block and wait for the results.

    One example of this is the pattern where you're using a dispatch queue instead of locks for synchronization. For example, assume you have a shared NSMutableArray a, with access mediated by dispatch queue q. A background thread might be appending to the array (async), while your foreground thread is pulling the first item off (synchronously):

    NSMutableArray *a = [[NSMutableArray alloc] init];
    // All access to `a` is via this dispatch queue!
    dispatch_queue_t q = dispatch_queue_create("com.foo.samplequeue", NULL);
    
    dispatch_async(q, ^{ [a addObject:something]; }); // append to array, non-blocking
    
    __block Something *first = nil;            // "__block" to make results from block available
    dispatch_sync(q, ^{                        // note that these 3 statements...
            if ([a count] > 0) {               // ...are all executed together...
                 first = [a objectAtIndex:0];  // ...as part of a single block...
                 [a removeObjectAtIndex:0];    // ...to ensure consistent results
            }
    });