Со временем любому 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];
Таким образом мы создали общение между классами без использование Делегатов.
Исходный код синглтона и пример проекта с его использованием находится на Assembla