UIViewController отклоняет синтаксис типа аргумента завершения viewviewcontrolleranimated

#objective-c #uiviewcontroller #ios5

#objective-c #uiviewcontroller #ios5

Вопрос:

void (^)(void) Синтаксис типа аргумента «завершение», реализованный методом UIViewController:

 - (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion
  

пробудил мое любопытство, и я не смог найти для него никакой документации. Пожалуйста, кто-нибудь может помочь объяснить его цель / значение?

Заранее большое спасибо.

Ответ №1:

Вот обсуждение блоков из моей книги:

http://www.apeth.com/iOSBook/ch03.html#_blocks

Там есть пример, но вот пример, который ближе к тому, о чем вы спрашиваете:

 [self transitionFromViewController:fromvc
                  toViewController:tovc
                          duration:0.4
                           options:UIViewAnimationOptionTransitionFlipFromLeft
                        animations:nil
                        completion:^(BOOL done){
                            [tovc didMoveToParentViewController:self];
                            [fromvc removeFromParentViewController];
                        }];
  

Блок завершения принимает один параметр, BOOL с именем «done», но он не используется его кодом. Идея заключается в том, что выполняется анимация, а затем выполняется код в блоке завершения.

Очень важно быть уверенным в блоках, потому что они — путь будущего. Например, анимация просмотра в iOS 4 использует их, как описано в разделе «Анимация просмотра на основе блоков» моей книги (сначала прочитайте о старом способе, затем прочитайте о новом способе iOS 4):

http://www.apeth.com/iOSBook/ch17.html#_view_animation

В iOS 5 блоки еще более важны; появляется все больше и больше ситуаций, когда они не являются необязательными.

Также блоки — это способ использования GCD (grand central dispatch), который, безусловно, является лучшим способом выполнения многопоточности.

Комментарии:

1. Спасибо, Мэтт, похоже, ты написал отличную книгу, есть планы на версию iOS 5?!

2. @Eddie: Я начал конвертировать все загружаемые примеры в iOS 5: github.com/mattneub/Programming-iOS-4-Book-Examples/tree/master/… Далее следует дополнительная информация…

Ответ №2:

Это было бы для блока завершения. Блок — это фрагмент кода, который может быть отправлен в качестве аргумента (часто используемого, как здесь, для обработки завершения) в API. Существует множество функций блоков, включая возможность ссылаться на память и поддерживать состояние.

Смотрите документацию по этой все более популярной функции Obj-C: http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

Блоки обеспечивают то, что можно считать поведением обратного вызова (обычно достигается с помощью делегирования или уведомления), но они позволяют программисту включать логику поведения завершения в том же контексте, что и инициирующее действие, делая код более выразительным и кратко передавая всю последовательность предполагаемого поведения.

Комментарии:

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

2. Спасибо, Айзек, я кратко прочитал о блоках, когда они были введены, но по глупости не изучил синтаксис!

3. @timthetoolman хороший совет. я расширил ответ, включив сравнение с другими распространенными механизмами обработки завершения в cocoa.