Ответ 1
Оба являются прекрасными образцами (и я проголосовал за то, что оба Фиро и Джон отвечают, потому что - да, это вопрос вкуса, и оба их ответа находятся на месте), но есть несколько отличных преимуществ для перехода с одним блоком, по моему опыту. Джон Вудс поднимает превосходный момент в отношении "аромата" API, хотя я бы утверждал, что сетевая операция всегда завершается (если у нее нет тайм-аута, который является другим классом ошибок) и что способ успеха/отказа не является вполне либо/или.
-
Это устраняет необходимость дублирования кода между блоками, которые являются общими для разрыва задачи при завершении независимо от успеха или сбоя.
-
Он обеспечивает единый концептуальный поток выполнения между планированием задачи и знанием, когда задача завершена. Когда эта задача будет завершена, вызывается блок завершения.
-
В некоторых ситуациях отказ может фактически генерировать данные, которые должны обрабатываться таким образом, как путь успеха. В меньшем количестве случаев успешное завершение может фактически нести ошибку. Хотя шаблон
NSError**
на методах является чисто или/или, одно из преимуществ использования либо шаблона блока заключается в том, что это можно выразить. Дополнительным преимуществом использования одного блока завершения является то, что вы избегаете дублирования логики. -
Несколько блоков в качестве параметров методов являются плоскими, уродливыми и раздражающими. Существует причина, по которой шаблон кодирования передается только одному блоку методу и всегда делает этот блок последним параметром. К сожалению, даже системные API не последовательно следуют этому шаблону, хотя использование ограничено в основном случаями, когда блоки имеют тенденцию быть простыми. Главным образом.
Это позволяет избежать бессмыслицы:
[foo doSomething: ^{
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
} andSomethingElse: ^{
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
}];