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