среда, 12 августа 2015 г.

12. Блоки

Ссылка на урок.
В Этом уроке рассмотрены блоки.
Блок  это фрагмент кода, имеющий имя,  который можно использовать повторно.
Пример объявления блока  (ничего не возвращающего и не принимающего).
Второй строкой идет инициализация блока.

    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

Комментариев нет:

Отправить комментарий