-(void) doJob :(Job*)job completion: (completionBlockWithArray) completion {
// do some stuff here that fails or succeeds 
 success:^(SomeType y) {
 ///
 completion(y, YES);
 } failure:^(SomeType y) {
 ///
 completion(y, NO);
 }];

Напоминаем, что завершение - это блок, который * передается * в эту функцию в качестве параметра.

Вот пример передачи блока завершения, который использовался выше в случае успеха / неудачи.

[self doJob:self.job
 completion:^(BOOL success,
 NSArray *array,
 NSString *errorMessage) {
 
 // do some things here
 }
 ];

Также напоминаем, что Apple настоятельно не рекомендует их использовать. Хорошие разработчики Objective-C не используют блоки успеха / неудачи в Objective-C, они тестируют, используя условие if-else. Избегайте такого рода синтаксического сахара.

Разработчик * действительно * не делает этого в Swift. Они используют блоки однократного завершения с обратными вызовами.

Между прочим, это typedef для сигнатуры * завершенияBlockWithArray *, использованной выше.

typedef void (^completionBlockWithArray) (BOOL success, NSArray *array, NSString *errorMessage);