Ответ 1
Блоки закрывают (или лямбда-функции, однако вы их называете). Их цель состоит в том, что с использованием блоков программисту не нужно создавать именованные функции в глобальной области действия или предоставлять обратный вызов целевого действия, вместо этого он может создать неназванную локальную "функцию", которая может обращаться к переменным в своем приложении и легко выполнять действия.
Например, когда вы хотите использовать e. г. отправьте асинхронную операцию, такую анимацию для просмотров, без блоков, и вы хотели получить уведомление о конкурсе, вам пришлось написать:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:context:)];
.... set up animation ....
[UIView commitAnimations];
Это много кода, кроме того, это подразумевает наличие допустимого указателя self
, который может быть не всегда доступен (я испытываю такую вещь, когда я разрабатывал MobileSubstrate-tweaks). Таким образом, вместо этого вы можете использовать блоки из iOS 4.0 и далее:
[UIView animateWithDuration:1.0 animations:^{
// set up animation
} completion:^{
// this will be executed on completion
}];
Или, например, загружая онлайн-ресурсы с помощью NSURLConnection... B. b. (Перед блоками):
urlConnection.delegate = self;
- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)rsp
{
// ...
}
- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
// ...
}
// and so on, there are 4 or 5 delegate methods...
а. Б. (Anno Blocks):
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rsp, NSData *d, NSError *e) {
// process request here
}];
Гораздо проще, чище и короче.