sam80
sam80

Reputation: 83

Dispatch_sync or completion block difference in objective-c

I'm struggling with GCD and blocks. I'm trying to create a series of methods that require data from a previous one. I was thinking about 2 different ways to achieve it.

  1. dispatch_sync serial queue
  2. nested completion blocks

Don't you think the following 2 options return the same value? AS far as I read in Apple's dispatch queues, DISPATCH_QUEUE_SERIAL runs in FIFO order. So both options should return identical values.

What am I doing wrong here? and which one is the best approach? Thanks for your help!

//Option 1

dispatch_queue_t delete_queue = dispatch_queue_create("delete_queue", DISPATCH_QUEUE_SERIAL);

dispatch_sync(delete_queue, ^{       
    [self dosomething];
});

dispatch_sync(delete_queue, ^{
    [self dosomething2];
});

dispatch_sync(delete_queue, ^{
    [self dosomething3]; 
});    

//Option 2

-(void)dosomething1:(dispatch_block_t)completion;
-(void)dosomething2:(dispatch_block_t)completion;
-(void)dosomething3:(dispatch_block_t)completion;

[self dosomething:^{ 
    [self dosomething2:^{
        [self dosomething3:^{}];
    }];
}];

-(void)dosomething:(dispatch_block_t)completion {

    /*method logic here*/
    completion();
}
-(void)dosomething2:(dispatch_block_t)completion {

   /*method logic here*/
   completion();
}
-(void)dosomething3:(dispatch_block_t)completion {

   /*method logic here*/
   completion();
}

Upvotes: 0

Views: 641

Answers (2)

Jeremy Huddleston Sequoia
Jeremy Huddleston Sequoia

Reputation: 23623

It doesn't really make sense to do three separate calls to dispatch_sync() here:

dispatch_sync(delete_queue, ^{       
    [self dosomething];
});

dispatch_sync(delete_queue, ^{
    [self dosomething2];
});

dispatch_sync(delete_queue, ^{
    [self dosomething3]; 
});    

You should instead just do them all in a single block:

dispatch_sync(delete_queue, ^{       
    [self dosomething];
    [self dosomething2];
    [self dosomething3]; 
});    

As for the use of completion blocks, you can certainly obtain a similar result, except that the completion-handler result would need to be asynchronous.

I think you need to take a step back and explain what kind of API you are trying to design in order to determine how you want to use the tools of the system and language to achieve that API design.

Upvotes: 0

newacct
newacct

Reputation: 122439

Both code samples you have shown are equivalent to just:

[self dosomething];
[self dosomething2];
[self dosomething3]; 

In other words, both ways execute the methods synchronously, in order, and block the thread until they are done.

Also, as Ken Thomases said, none of your methods "return" anything, so your question about returning doesn't make sense.

Upvotes: 1

Related Questions