This isn't equivalent. If `self.delegate` changes before the block is run it will attempt to call the method on the wrong object. For the equivalent behavior you need

```objc
id delegate = self.delegate;
dispatch_async(dispatch_get_main_queue(), ^{
    [delegate detectOperation:self finishedScanningVolume:volume];
});
```

Although you really should actually pull out the `delegate` before even testing `-respondsToSelector:`.