Со временем любому iOS-разработчику наскучит создавать свои синглтоны, которые взаимодействуют с остальными классами через Delegate. Пришло время использовать блоки.
Для справки: блоки появились впервые на Mac OS 10.6 и iOS 4.0, однако многие iOS-разработчики игнорируют этот факт.
Чем же хороши блоки и зачем их использовать? Разумеется в них нет необходимости, потому что всегда найдется способ заменить блок. Но такой способ не всегда будет правильным с точки зрения удобности и дружелюбности кода.
Рассмотрим простейший пример взаимодействия блока.
Я создал синглтон, содержащий в себе блок, и назвал его просто и понятно DPHelperWithBlock.
DPHelperWithBlock.h
//объявляем тип блока (возвращаемое значение булевая переменная, в качестве параметра строка) typedef BOOL (^DPResultBlock) (NSString *result); @interface DPHelperWithBlock : NSObject //объявляем блок @property (nonatomic, copy) DPResultBlock resultBlock; //метод, который вызовет блок - (void)startBlockWorking;
DPHelperWithBlock.m
#import "DPHelperWithBlock.h" @implementation DPHelperWithBlock #pragma mark — Init method - (id)init { if (self = [super init]) { } return self; } //реализация метода, который вызовет блок - (void)startBlockWorking { //вызов блока, передаем параметром строку «Hello!» _resultBlock(@"Hello!"); } @end
Что будет после вызова блока? Куда мы попадем? А попадем мы туда, где находится реализация данного блока. Реализовать его можно в любом классе:
//инициализация объекта DPHelperWithBlock *myHelperWithBlock = [DPHelperWithBlock new]; //реализация блока myHelperWithBlock.resultBlock = ^(NSString *result){ //сюда мы попадаем сразу же после вызова блока, переменная result будем содержать «Hello!» NSLog(@"result = %@", result); //возвращаем значение return YES; }; //вызываем метод, вызывающий блок [myHelperWithBlock startBlockWorking];
Таким образом мы создали общение между классами без использование Делегатов.
Немає коментарів:
Дописати коментар