#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.