The obvious-in-retrospect problem is that return in a block just exits the block. If the block is being queued for asychronous execution, that probably does what you want, to quit early.

If the block is being executed synchronously, return exits the block, but execution carries on after the block. In this case, [self doSomethingWithNewFoo] will now be executed all of the time. Which is decidedly not what I wanted.