Ссылка на урок.
В Этом уроке рассмотрены блоки.
Блок это фрагмент кода, имеющий имя, который можно использовать повторно.
Пример объявления блока (ничего не возвращающего и не принимающего).
Второй строкой идет инициализация блока.
void (^testBlock)(void);
testBlock = ^{ NSLog(@"test block"); };
Вызов на выполнение блока:
testBlock();
Можно определить свой тип:
typedef void(^OurTestBlock)(void);
OurTestBlock testBlock = ^{ NSLog(@"test block"); };
Определение и инициализация (одной строкой) блока с параметрами + вызов:
void (^testBlockWithParams)(NSString*,NSInteger)=^(NSString *string, NSInteger intValue){
NSLog(@"Test block with parametrs: string: %@, int: %@",string ,@(intValue));
};
testBlockWithParams(@"test string",33);
Определение, инициализация и вызов блока возвращающего значение с параметрами:
NSString * (^testBlockWithReturnValueAndParams)(NSString*,NSInteger)=^(NSString *string, NSInteger intValue){
return [NSString stringWithFormat: @"Test Block with Return value and parametrs: string: %@, int: %@",string ,@(intValue)];
};
NSLog(@"%@", testBlockWithReturnValueAndParams(@"string method with return",13));
Блок видит переменные используемые за пределами блока.
Чтобы изменять внешние переменные в блоке используется конструкция __block
__block NSString * testString=@"how is it possible?";
void (^testBlock2)(void);
__block NSInteger i=0;
testBlock2 = ^{
i++;
//NSLog(@"test block2");
testString=[NSString stringWithFormat:@"How is it possible: %@",@(i)];
NSLog(@"%@",testString);
};
testBlock2();
testBlock2();
Блок можно передать в качестве параметра в метод:
[self testBlocksMethod:^{
NSLog(@"BLOCK");
}];
Определение метода:
-(void) testBlocksMethod : (void (^)(void)) testBlock {
NSLog(@"TestBlockMethod");
testBlock();
}
Использование блока для сортировки массивов:
NSArray *array=nil;
NSComparisonResult (^bb)(id , id )=^(id __nonnull obj1, id __nonnull obj2){
return NSOrderedAscending;
};
array=[array sortedArrayUsingComparator:bb];
Если блок используется в качеств проперти, То необходимо указывать тип ссылки @property(copy)
Чтобы не было утечки памяти в случае если блок и другое property ссылаются друг на друга, необходимо использовать конструкцию __weak:
typedef void (^objectBlock)(void);
@interface TAObject : NSObject
@property(strong,nonatomic) NSString * name;
@property (copy,nonatomic) objectBlock objBlock;
@end
@implementation TAObject
- (instancetype)init
{
self = [super init];
if (self) {
__weak TAObject *weakSelf=self;
self.objBlock=^{
NSLog(@"%@",weakSelf.name);
};
}
return self;
}
еще пример:
@interface AppDelegate ()
@property (copy ,nonatomic) OurTestBlock testBlock;
@property(strong,nonatomic)NSString *name;
@end
TAObject * obj= [[TAObject alloc]init];
obj.name= @"OBJECT";
__weak TAObject * weakObj=obj;
self.testBlock=^{
NSLog(@"%@",weakObj.name );
};
self.testBlock();
В блоке та же видимость переменных, что и за пределами блока.
Пример какой объект блок будет считать за self:
TAObject * obj1= [[TAObject alloc]init];
obj1.name= @"OBJECT";
self.name=@"hello";
[obj1 testMethod:^{
NSLog(@"%@",self.name);
}];
Вывод: hello .
Исходный проект с тестовым уроком 12 Блоки
Домашнее задание к уроку 12 - Блоки.
Ученик. Фактически это повторить первую половину.
1. В апп делегате создайте блок с без возвращаемой переменной и без параметров и вызовите его.
2. Создайте блоки с параметрами и передайте туда строку, которую выведите на экран в последствии.
3. Если вы не определили тип данных для ваших блоков, то сделайте это сейчас и используйте их
4. Создайте метод который принимает блок и вызывает его и вызовите этот метод.
Студент.
5. Создайте класс студент с проперти имя и фамилия.
6. Создайте в аппделегате 10 разных студентов, пусть у парочки будут одинаковые фамилии.
7. Поместите всех в массив.
8. Используя соответствующий метод сортировки массива (с блоком) отсортируйте массив студентов сначала по фамилии, а если они одинаковы то по имени.
Мастер.
9. Задание из видео. Из урока о делегатах. У пациентов удалите протокол делегат и соответствующее проперти.
10. Добавьте метод принимающий блок когда им станет плохо.
11. Блок должен передавать указатель на самого студента ну и на те параметры, которые были в задании по делегатам.
12. Теперь когда пациентам поплохеет, они должны вызывать блок, а в блоке нужно принимать решения что делать (доктор не нужен делайте все в апп делегате)
Супермен
13. Познайте истинное предназначение блоков :) Пусть пациентам становится плохо не тогда когда вы их вызываете в цикле(это убрать), а через случайное время 5-15 секунд после создания (используйте специальный метод из урока по селекторам в ините пациента).
14. не забудьте массив пациентов сделать проперти аппделегата, а то все помрут по выходе из функции так и не дождавшись :)
Выполнил все задания (ученик, студент, мастер, супермен).
Проект с домашним заданием к уроку №12 блоки.
Вывод консоли получился такой:
2015-08-13 17:14:52.495 DZ12Block[3330:104595] Pupil homeWork DZ12
2015-08-13 17:14:52.496 DZ12Block[3330:104595] blockTest1 without parametrs
2015-08-13 17:14:52.496 DZ12Block[3330:104595] blocktest2 without parametrs return string
2015-08-13 17:14:52.496 DZ12Block[3330:104595] Own blocktype with parametr and no return
2015-08-13 17:14:52.497 DZ12Block[3330:104595] Own blocktype1 with parametr and return string
2015-08-13 17:14:52.497 DZ12Block[3330:104595] block receive into method test string1 into test block5
2015-08-13 17:14:52.497 DZ12Block[3330:104595] testBlockMethod: return testblock5:test string1 into test block5, str-method`s parametr: string`s parametr method`s testBlockMethod
2015-08-13 17:14:52.497 DZ12Block[3330:104595] Student homeWork DZ12
2015-08-13 17:14:52.498 DZ12Block[3330:104595] Dubovoi Sergey
2015-08-13 17:14:52.498 DZ12Block[3330:104595] Ivanov Dima
2015-08-13 17:14:52.498 DZ12Block[3330:104595] Ivanov Kostya
2015-08-13 17:14:52.499 DZ12Block[3330:104595] Ivanov Vasya
2015-08-13 17:14:52.499 DZ12Block[3330:104595] Petrov Petya
2015-08-13 17:14:52.499 DZ12Block[3330:104595] Petrova Lusia
2015-08-13 17:14:52.585 DZ12Block[3330:104595] Sidorov Vasya
2015-08-13 17:14:52.585 DZ12Block[3330:104595] Strelcova Ola
2015-08-13 17:14:52.585 DZ12Block[3330:104595] Voronina Ira
2015-08-13 17:14:52.585 DZ12Block[3330:104595] Voronina Natasha
2015-08-13 17:14:52.586 DZ12Block[3330:104595] Master homeWork DZ12
2015-08-13 17:14:52.586 DZ12Block[3330:104595] Vasya temperature:39.5 and Head Ache.
2015-08-13 17:14:52.587 DZ12Block[3330:104595] Patient Vasya temperature: 39.5 Ache: Head Ache. Treat headache
2015-08-13 17:14:52.587 DZ12Block[3330:104595] Vasya treat. Rating doctor: 5
2015-08-13 17:14:52.594 DZ12Block[3330:104595] Kolya temperature:38.5 and Stomach stomachache.
2015-08-13 17:14:52.598 DZ12Block[3330:104595] Patient Kolya temperature: 38.5 Ache: Stomach stomachache. Treat Heartache
2015-08-13 17:14:52.599 DZ12Block[3330:104595] Kolya treat. Rating doctor: 1
2015-08-13 17:14:52.599 DZ12Block[3330:104595] Dima temperature:40.5 and ToothAche Ache.
2015-08-13 17:14:52.600 DZ12Block[3330:104595] Patient Dima temperature: 40.5 Ache: ToothAche Ache. Treat ToothAche
2015-08-13 17:14:52.766 DZ12Block[3330:104595] Dima treat. Rating doctor: 2
2015-08-13 17:14:52.766 DZ12Block[3330:104595] Natasha temperature:37 and Heart heartache.
2015-08-13 17:14:52.767 DZ12Block[3330:104595] Patient Natasha temperature: 37 Ache: Heart heartache. Treat Heartache
2015-08-13 17:14:52.768 DZ12Block[3330:104595] Natasha treat. Rating doctor: 4
2015-08-13 17:14:52.769 DZ12Block[3330:104595] Denis temperature:36 and Head Ache.
2015-08-13 17:14:52.769 DZ12Block[3330:104595] Patient Denis temperature: 36 Ache: Head Ache. Treat headache
2015-08-13 17:14:52.770 DZ12Block[3330:104595] Denis treat. Rating doctor: 2
2015-08-13 17:14:52.770 DZ12Block[3330:104595] SuperMan homeWork DZ12
2015-08-13 17:14:52.777 DZ12Block[3330:104595] patient:Vasya deallocated
2015-08-13 17:14:52.777 DZ12Block[3330:104595] patient:Kolya deallocated
2015-08-13 17:14:52.777 DZ12Block[3330:104595] patient:Dima deallocated
2015-08-13 17:14:52.778 DZ12Block[3330:104595] patient:Natasha deallocated
2015-08-13 17:14:52.778 DZ12Block[3330:104595] patient:Denis deallocated
2015-08-13 17:15:00.776 DZ12Block[3330:104595] Dima temperature:36 and Head Ache.
2015-08-13 17:15:00.777 DZ12Block[3330:104595] Patient Dima temperature: 36 Ache: Head Ache. Treat headache
2015-08-13 17:15:01.776 DZ12Block[3330:104595] vasya temperature:39.5 and Head Ache.
2015-08-13 17:15:01.776 DZ12Block[3330:104595] Patient vasya temperature: 39.5 Ache: Head Ache. Treat headache
2015-08-13 17:15:01.778 DZ12Block[3330:104595] Dima temperature:40.5 and ToothAche Ache.
2015-08-13 17:15:01.779 DZ12Block[3330:104595] Patient Dima temperature: 40.5 Ache: ToothAche Ache. Treat ToothAche
2015-08-13 17:15:02.776 DZ12Block[3330:104595] Natasha temperature:37 and Heart heartache.
2015-08-13 17:15:02.777 DZ12Block[3330:104595] Patient Natasha temperature: 37 Ache: Heart heartache. Treat Heartache
2015-08-13 17:15:07.776 DZ12Block[3330:104595] Kolya temperature:38.5 and Stomach stomachache.
2015-08-13 17:15:07.777 DZ12Block[3330:104595] Patient Kolya temperature: 38.5 Ache: Stomach stomachache. Treat Heartache
В Этом уроке рассмотрены блоки.
Блок это фрагмент кода, имеющий имя, который можно использовать повторно.
Пример объявления блока (ничего не возвращающего и не принимающего).
Второй строкой идет инициализация блока.
void (^testBlock)(void);
testBlock = ^{ NSLog(@"test block"); };
Вызов на выполнение блока:
testBlock();
Можно определить свой тип:
typedef void(^OurTestBlock)(void);
OurTestBlock testBlock = ^{ NSLog(@"test block"); };
Определение и инициализация (одной строкой) блока с параметрами + вызов:
void (^testBlockWithParams)(NSString*,NSInteger)=^(NSString *string, NSInteger intValue){
NSLog(@"Test block with parametrs: string: %@, int: %@",string ,@(intValue));
};
testBlockWithParams(@"test string",33);
Определение, инициализация и вызов блока возвращающего значение с параметрами:
NSString * (^testBlockWithReturnValueAndParams)(NSString*,NSInteger)=^(NSString *string, NSInteger intValue){
return [NSString stringWithFormat: @"Test Block with Return value and parametrs: string: %@, int: %@",string ,@(intValue)];
};
NSLog(@"%@", testBlockWithReturnValueAndParams(@"string method with return",13));
Блок видит переменные используемые за пределами блока.
Чтобы изменять внешние переменные в блоке используется конструкция __block
__block NSString * testString=@"how is it possible?";
void (^testBlock2)(void);
__block NSInteger i=0;
testBlock2 = ^{
i++;
//NSLog(@"test block2");
testString=[NSString stringWithFormat:@"How is it possible: %@",@(i)];
NSLog(@"%@",testString);
};
testBlock2();
testBlock2();
Блок можно передать в качестве параметра в метод:
[self testBlocksMethod:^{
NSLog(@"BLOCK");
}];
Определение метода:
-(void) testBlocksMethod : (void (^)(void)) testBlock {
NSLog(@"TestBlockMethod");
testBlock();
}
Использование блока для сортировки массивов:
NSArray *array=nil;
NSComparisonResult (^bb)(id , id )=^(id __nonnull obj1, id __nonnull obj2){
return NSOrderedAscending;
};
array=[array sortedArrayUsingComparator:bb];
Если блок используется в качеств проперти, То необходимо указывать тип ссылки @property(copy)
Чтобы не было утечки памяти в случае если блок и другое property ссылаются друг на друга, необходимо использовать конструкцию __weak:
typedef void (^objectBlock)(void);
@interface TAObject : NSObject
@property(strong,nonatomic) NSString * name;
@property (copy,nonatomic) objectBlock objBlock;
@end
@implementation TAObject
- (instancetype)init
{
self = [super init];
if (self) {
__weak TAObject *weakSelf=self;
self.objBlock=^{
NSLog(@"%@",weakSelf.name);
};
}
return self;
}
еще пример:
@interface AppDelegate ()
@property (copy ,nonatomic) OurTestBlock testBlock;
@property(strong,nonatomic)NSString *name;
@end
TAObject * obj= [[TAObject alloc]init];
obj.name= @"OBJECT";
__weak TAObject * weakObj=obj;
self.testBlock=^{
NSLog(@"%@",weakObj.name );
};
self.testBlock();
В блоке та же видимость переменных, что и за пределами блока.
Пример какой объект блок будет считать за self:
TAObject * obj1= [[TAObject alloc]init];
obj1.name= @"OBJECT";
self.name=@"hello";
[obj1 testMethod:^{
NSLog(@"%@",self.name);
}];
Вывод: hello .
Исходный проект с тестовым уроком 12 Блоки
Домашнее задание к уроку 12 - Блоки.
Ученик. Фактически это повторить первую половину.
1. В апп делегате создайте блок с без возвращаемой переменной и без параметров и вызовите его.
2. Создайте блоки с параметрами и передайте туда строку, которую выведите на экран в последствии.
3. Если вы не определили тип данных для ваших блоков, то сделайте это сейчас и используйте их
4. Создайте метод который принимает блок и вызывает его и вызовите этот метод.
Студент.
5. Создайте класс студент с проперти имя и фамилия.
6. Создайте в аппделегате 10 разных студентов, пусть у парочки будут одинаковые фамилии.
7. Поместите всех в массив.
8. Используя соответствующий метод сортировки массива (с блоком) отсортируйте массив студентов сначала по фамилии, а если они одинаковы то по имени.
Мастер.
9. Задание из видео. Из урока о делегатах. У пациентов удалите протокол делегат и соответствующее проперти.
10. Добавьте метод принимающий блок когда им станет плохо.
11. Блок должен передавать указатель на самого студента ну и на те параметры, которые были в задании по делегатам.
12. Теперь когда пациентам поплохеет, они должны вызывать блок, а в блоке нужно принимать решения что делать (доктор не нужен делайте все в апп делегате)
Супермен
13. Познайте истинное предназначение блоков :) Пусть пациентам становится плохо не тогда когда вы их вызываете в цикле(это убрать), а через случайное время 5-15 секунд после создания (используйте специальный метод из урока по селекторам в ините пациента).
14. не забудьте массив пациентов сделать проперти аппделегата, а то все помрут по выходе из функции так и не дождавшись :)
Выполнил все задания (ученик, студент, мастер, супермен).
Проект с домашним заданием к уроку №12 блоки.
Вывод консоли получился такой:
2015-08-13 17:14:52.495 DZ12Block[3330:104595] Pupil homeWork DZ12
2015-08-13 17:14:52.496 DZ12Block[3330:104595] blockTest1 without parametrs
2015-08-13 17:14:52.496 DZ12Block[3330:104595] blocktest2 without parametrs return string
2015-08-13 17:14:52.496 DZ12Block[3330:104595] Own blocktype with parametr and no return
2015-08-13 17:14:52.497 DZ12Block[3330:104595] Own blocktype1 with parametr and return string
2015-08-13 17:14:52.497 DZ12Block[3330:104595] block receive into method test string1 into test block5
2015-08-13 17:14:52.497 DZ12Block[3330:104595] testBlockMethod: return testblock5:test string1 into test block5, str-method`s parametr: string`s parametr method`s testBlockMethod
2015-08-13 17:14:52.497 DZ12Block[3330:104595] Student homeWork DZ12
2015-08-13 17:14:52.498 DZ12Block[3330:104595] Dubovoi Sergey
2015-08-13 17:14:52.498 DZ12Block[3330:104595] Ivanov Dima
2015-08-13 17:14:52.498 DZ12Block[3330:104595] Ivanov Kostya
2015-08-13 17:14:52.499 DZ12Block[3330:104595] Ivanov Vasya
2015-08-13 17:14:52.499 DZ12Block[3330:104595] Petrov Petya
2015-08-13 17:14:52.499 DZ12Block[3330:104595] Petrova Lusia
2015-08-13 17:14:52.585 DZ12Block[3330:104595] Sidorov Vasya
2015-08-13 17:14:52.585 DZ12Block[3330:104595] Strelcova Ola
2015-08-13 17:14:52.585 DZ12Block[3330:104595] Voronina Ira
2015-08-13 17:14:52.585 DZ12Block[3330:104595] Voronina Natasha
2015-08-13 17:14:52.586 DZ12Block[3330:104595] Master homeWork DZ12
2015-08-13 17:14:52.586 DZ12Block[3330:104595] Vasya temperature:39.5 and Head Ache.
2015-08-13 17:14:52.587 DZ12Block[3330:104595] Patient Vasya temperature: 39.5 Ache: Head Ache. Treat headache
2015-08-13 17:14:52.587 DZ12Block[3330:104595] Vasya treat. Rating doctor: 5
2015-08-13 17:14:52.594 DZ12Block[3330:104595] Kolya temperature:38.5 and Stomach stomachache.
2015-08-13 17:14:52.598 DZ12Block[3330:104595] Patient Kolya temperature: 38.5 Ache: Stomach stomachache. Treat Heartache
2015-08-13 17:14:52.599 DZ12Block[3330:104595] Kolya treat. Rating doctor: 1
2015-08-13 17:14:52.599 DZ12Block[3330:104595] Dima temperature:40.5 and ToothAche Ache.
2015-08-13 17:14:52.600 DZ12Block[3330:104595] Patient Dima temperature: 40.5 Ache: ToothAche Ache. Treat ToothAche
2015-08-13 17:14:52.766 DZ12Block[3330:104595] Dima treat. Rating doctor: 2
2015-08-13 17:14:52.766 DZ12Block[3330:104595] Natasha temperature:37 and Heart heartache.
2015-08-13 17:14:52.767 DZ12Block[3330:104595] Patient Natasha temperature: 37 Ache: Heart heartache. Treat Heartache
2015-08-13 17:14:52.768 DZ12Block[3330:104595] Natasha treat. Rating doctor: 4
2015-08-13 17:14:52.769 DZ12Block[3330:104595] Denis temperature:36 and Head Ache.
2015-08-13 17:14:52.769 DZ12Block[3330:104595] Patient Denis temperature: 36 Ache: Head Ache. Treat headache
2015-08-13 17:14:52.770 DZ12Block[3330:104595] Denis treat. Rating doctor: 2
2015-08-13 17:14:52.770 DZ12Block[3330:104595] SuperMan homeWork DZ12
2015-08-13 17:14:52.777 DZ12Block[3330:104595] patient:Vasya deallocated
2015-08-13 17:14:52.777 DZ12Block[3330:104595] patient:Kolya deallocated
2015-08-13 17:14:52.777 DZ12Block[3330:104595] patient:Dima deallocated
2015-08-13 17:14:52.778 DZ12Block[3330:104595] patient:Natasha deallocated
2015-08-13 17:14:52.778 DZ12Block[3330:104595] patient:Denis deallocated
2015-08-13 17:15:00.776 DZ12Block[3330:104595] Dima temperature:36 and Head Ache.
2015-08-13 17:15:00.777 DZ12Block[3330:104595] Patient Dima temperature: 36 Ache: Head Ache. Treat headache
2015-08-13 17:15:01.776 DZ12Block[3330:104595] vasya temperature:39.5 and Head Ache.
2015-08-13 17:15:01.776 DZ12Block[3330:104595] Patient vasya temperature: 39.5 Ache: Head Ache. Treat headache
2015-08-13 17:15:01.778 DZ12Block[3330:104595] Dima temperature:40.5 and ToothAche Ache.
2015-08-13 17:15:01.779 DZ12Block[3330:104595] Patient Dima temperature: 40.5 Ache: ToothAche Ache. Treat ToothAche
2015-08-13 17:15:02.776 DZ12Block[3330:104595] Natasha temperature:37 and Heart heartache.
2015-08-13 17:15:02.777 DZ12Block[3330:104595] Patient Natasha temperature: 37 Ache: Heart heartache. Treat Heartache
2015-08-13 17:15:07.776 DZ12Block[3330:104595] Kolya temperature:38.5 and Stomach stomachache.
2015-08-13 17:15:07.777 DZ12Block[3330:104595] Patient Kolya temperature: 38.5 Ache: Stomach stomachache. Treat Heartache
Комментариев нет:
Отправить комментарий