Подтвердить что ты не робот

Какова цель использования блоков

Я хочу использовать блоки в своем приложении, но я ничего не знаю о блоках. Может ли кто-нибудь объяснить, как и почему я должен использовать блоки в своем коде?

4b9b3361

Ответ 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
}];

Гораздо проще, чище и короче.

Ответ 2

Цитата Учебник Ray Wenderlich

Блоки являются первоклассными функциями, что является причудливым способом сказать, что Блоки являются регулярными объектами Objective-C. Поскольку theyre объекты, они могут передаваться как параметры, возвращенные из методов и функций, и присвоенный переменным. Блоки называются замыканиями на других языках таких как Python, Ruby и Lisp, поскольку они инкапсулируют состояние, когда они объявлены. Блок создает константную копию любой локальной переменной который упоминается внутри его сферы действия. Перед блоками, когда вы хотел вызвать какой-то код и позвонить ему позже, вы бы обычно используют делегаты или NSNotificationCenter. Это отлично работает, кроме того, что он распространяет ваш код по всему - вы запускаете задачу в одном месте, и обрабатывать результат в другом.

Например, при использовании анимации с использованием блоков вам нужно делать все это:

[UIView beginAnimations:@"myAnimation" context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.5];
[myView setFrame:CGRectMake(30, 45, 43, 56)];
[UIView commitAnimations];

Только для этого:

[UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    [myView setFrame:CGRectMake(54, 66, 88, 33)];
}completion:^(BOOL done){
    //
}];

Ответ 3

Класс Objective-C определяет объект, который объединяет данные с соответствующим поведением. Иногда имеет смысл просто представлять одну задачу или единицу поведения, а не набор методов.