Peter Warbo
Peter Warbo

Reputation: 11700

NSManagedObjectContext performBlock within dispatch_async

I'm doing some background processing with GCD and saving some objects with Core Data. In method [self saveData] I'm creating a NSManagedObjectContext with concurrency type NSPrivateQueueConcurrencyType to perform the Core Data operations on a background thread. I'm running all my Core Data operations within performBlock.

Now, is it necessary to call [self saveData] from main thread or can I continue in the background thread I'm in (to avoid the extra call dispatch_async(dispatch_get_main_queue(), ^{});)

Like so:

dispatch_async(dispatch_get_global_queue(0, 0), ^{

    BOOL isProcessed = [self processData];
    if (isProcessed) {

        // Save with Core Data
        [self saveData];
    }
});

Or do I need to do:

dispatch_async(dispatch_get_global_queue(0, 0), ^{

    BOOL isProcessed = [self processData];
    if (isProcessed) {

        dispatch_async(dispatch_get_main_queue(), ^{

            // Save with Core Data
            [self saveData];
        });
    }
});

Upvotes: 2

Views: 1543

Answers (1)

Martin R
Martin R

Reputation: 539745

performBlock: and performBlockAndWait: ensure that the block operations are executed on the queue specified for the context. Therefore, it does not matter on which thread performBlock: or performBlockAndWait: are called.

The extra dispatch_async(dispatch_get_main_queue(), ^{}); is therefore not necessary if [self saveData] uses performBlock: for all operations.

Upvotes: 4

Related Questions