2014-02-06 4 views
2

Я задаюсь вопросом о том или нет, это хорошая практика:Обеспечение поставить блок завершения

У меня есть метод, который принимает в параметрах и блок обратного вызова, скажем, что-то вдоль линий:

-(void)loginWithUsername:(NSString *)username andPassword:(NSString *)password withCompletion:(LoginManagerCompletionBlock)completionHandler; 

Теперь в этом конкретном случае нет смысла использовать этот метод без обработчика завершения, поскольку он вызывает избыточный вызов веб-службы входа (также он не изменяет состояние чего-либо, а не на стороне клиента и сервер). Я бы хотел избежать этих ситуаций, активно применяя требование передать мне блок завершения, чтобы сделать этот вызов веб-службы. Я рассматриваю это как метод «@required» в протоколе Objective C. So мои вопросы таковы:

  1. Требуется блок завершения, чтобы выполнить эффективную практику действия в Objective C?
  2. (Edit: Answered) Как я могу обеспечить выполнение этого требования? Есть ли встроенный синтаксис языка, который может помочь мне здесь?

Благодаря

+1

интересный вопрос. В Android Java можно использовать атрибут @NotNull, было бы хорошо иметь что-то подобное в Obj-C –

ответ

7

Вы можете использовать атрибут функции nonnull(params), где PARAMS равен 1 или больше числа параметров, разделенных запятыми, чтобы указать, что параметр не должен быть пустым (nonnull без скобок означает, что все параметры указателя не должно быть пустым). Для примера:

- (void) loginWithUsername:(NSString *)username 
       andPassword:(NSString *)password 
      withCompletion:(LoginManagerCompletionBlock)completionHandler 
          __attribute__((nonnull(3))); 

Однако, в то время как это проверка во время компиляции и производит предупреждение будет только сделать это, если нуль передается непосредственно. Если значение аргумента является выражением, которое оценивается как null, например. переменная с нулевым значением, то это не будет поймано.

Если параметр является нулевым ошибка, вы можете добавить проверку выполнения внутри самого метода с использованием NSParameterAssert(parameter), где параметром является именем одного из параметров методы, для проверки этого условия. Этот вызов определяется для печати сообщения об ошибке и генерирования исключения, если его аргумент имеет значение false, а значение null - false.

+0

Это замечательно :) Есть ли что-нибудь еще, что вы можете добавить об этом, это хорошая/плохая практика? – Stavash

+2

@Stavash - Ну, это хорошая практика для документа, если параметр должен быть не нулевым, а атрибут выполняет это и обеспечивает (хотя и ограниченное) принудительное выполнение. Однако во время выполнения, если возможно, мягкая ошибка, вероятно, лучше, чем исключение, поскольку «NSParameterAssert» делает; но это субъективное мнение! – CRD

+0

Я согласен с тем, что документация в этом случае является хорошей практикой, но общий вопрос по-прежнему остается без ответа - как правило, было бы хорошей/плохой практикой прекратить выполнение операции, если код завершения не был предоставлен? – Stavash

3

Это именно то, что NSParameterAssert для. Используйте его, чтобы проверить, что параметры не ноль.

NSParameterAssert(completionParameter); 

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

+0

Спасибо @Wain - я думаю, что это утверждение выполняется во время выполнения, правильно? Есть ли флаг времени компиляции, который я могу использовать для обеспечения этого? – Stavash

+0

Да, это проверка времени выполнения. – Wain

Смежные вопросы