Slide 1

Slide 1 text

Block Khoa Pham - 2359Media

Slide 2

Slide 2 text

Block Definition Syntax Capture Usage

Slide 3

Slide 3 text

Definition

Slide 4

Slide 4 text

Block The closure that Apple adds to C Is an object (NSBlock) The compiler translate block literals into struct and functions. So we don’t see the alloc call

Slide 5

Slide 5 text

Block It is said to be the only object that can be allocated on the stack, by default. It is moved to heap when copied.

Slide 6

Slide 6 text

Block struct + captured state information

Slide 7

Slide 7 text

Syntax

Slide 8

Slide 8 text

Syntax The syntax of Objective C block http://arigrant. com/blog/2014/1/18/the-syntax-of-objective-c-blocks From C declarators to Objective C block syntax http://nilsou.com/blog/2013/08/21/objective-c-blocks-syntax/ Cheatsheet http://fuckingblocksyntax.com/

Slide 9

Slide 9 text

Syntax * [] () ^

Slide 10

Slide 10 text

Syntax () > [] > *, ^ Start from the variable name to right Then to the left Operator precedence http://unixwiz.net/techtips/reading-cdecl.html CDECL http://cdecl.org/

Slide 11

Slide 11 text

Syntax int a;

Slide 12

Slide 12 text

Syntax int a; a is an int

Slide 13

Slide 13 text

Syntax int *a;

Slide 14

Slide 14 text

Syntax int *a; a is a pointer to an int

Slide 15

Slide 15 text

Syntax int a[];

Slide 16

Slide 16 text

Syntax int a[]; a is an array of int

Slide 17

Slide 17 text

Syntax int f();

Slide 18

Slide 18 text

Syntax int f(); f is a function that returns an int

Slide 19

Slide 19 text

Syntax int f(long); f is a function that returns an int, and accepts a long

Slide 20

Slide 20 text

Syntax int *a[];

Slide 21

Slide 21 text

Syntax int *a[]; a is an array of pointers to int

Slide 22

Slide 22 text

Syntax int *(a[]); a is an array of pointers to int

Slide 23

Slide 23 text

Syntax int (*)a[];

Slide 24

Slide 24 text

Syntax int (*)a[]; a is a pointer to an array of ints

Slide 25

Slide 25 text

Syntax int *f();

Slide 26

Slide 26 text

Syntax int *f(); f is function that returns a pointer to an int

Slide 27

Slide 27 text

Syntax int *(f()); f is function that returns a pointer to an int

Slide 28

Slide 28 text

Syntax int (*f)();

Slide 29

Slide 29 text

Syntax int (*f)(); f is a pointer to a function which accepts nothing and returns an int

Slide 30

Slide 30 text

Syntax void (^successBlock)(NSDictionary *response); successBlock is a block pointer to a function which takes a dictionary and returns nothing

Slide 31

Slide 31 text

Syntax ^ is the block pointer, which can only be applied to function int ^f(); // Error

Slide 32

Slide 32 text

^ unary operator int (^doubleMe)(int) = ^(int a){ return a * 2; } int b = doubleMe(2);

Slide 33

Slide 33 text

^ unary operator Transform function implementation into a block Infer the return type

Slide 34

Slide 34 text

^ unary operator BOOL (^customBlock)(NSArray *) = ^(NSArray *array) { // return array.count == 3; // Please don’t if (array.count == 3) { return YES; } return NO; };

Slide 35

Slide 35 text

__block What does the block keyword mean http://stackoverflow.com/questions/7080927/what-does-the-block-keyword- mean

Slide 36

Slide 36 text

__block Access to __block variable http://clang.llvm.org/docs/Block-ABI-Apple.html#layout-of-block-marked- variables By default, variables used withtin the block are copied Rewrite access,

Slide 37

Slide 37 text

__block (Kiwi example) describe(@"it takes a while" , ^{ __block NSDictionary *apiResponse = nil; beforeAll(^{ __block BOOL requestCompleted = NO; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest: request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { requestCompleted = YES; apiResponse = JSON; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { requestCompleted = YES; } ]; [operation start]; [KWSpec waitWithTimeout:3.0 forCondition: ^BOOL() { return requestCompleted; }]; }); it(@"includes the related objects in the response" , ^{ [[[apiResponse objectForKey: @"children" ] should] containObjects: @"foo", @"bar", @"baz", nil]; }); });

Slide 38

Slide 38 text

Capture

Slide 39

Slide 39 text

Capture The ability to capture values from the enclosing scope, making them similar to closures or lambdas in other programming languages.

Slide 40

Slide 40 text

weakSelf vs strongSelf __weak __typeof__(self) weakSelf = self; self.block = ^{ __typeof__(self) strongSelf = weakSelf; [strongSelf doSomething]; [strongSelf doSomethingElse]; }; The block property is declared as “copy”

Slide 41

Slide 41 text

weakSelf vs strongSelf Understand weakSelf and strongSelf http://www.fantageek. com/1090/understanding-weak-self-and- strong-self/

Slide 42

Slide 42 text

weakSelf vs strongSelf Block is allocated on the stack. It has no effect on the storage of lifetime of anything it accesses. When they are copied, they take their captured scope with them, retaining any objects they refer

Slide 43

Slide 43 text

weakSelf vs strongSelf Block captures the variable along with its decorators (i.e. weak qualifier),

Slide 44

Slide 44 text

weakSelf vs strongSelf Block captures the variable along with its decorators (i.e. weak qualifier),

Slide 45

Slide 45 text

weakSelf vs strongSelf You should only use a weak reference to self, if self will hold on to a reference of the block.

Slide 46

Slide 46 text

Take care

Slide 47

Slide 47 text

UIView animation block [UIView animateWithDuration:0.5 delay:1.0 options: UIViewAnimationCurveEaseOut animations:^{ self.basketTop.frame = basketTopFrame; self.basketBottom.frame = basketBottomFrame; } completion:^(BOOL finished){ NSLog(@"Done!"); }];

Slide 48

Slide 48 text

UIView animation block - (void)loopThisBlock { [UIView animateWithDuration:0.2 animations:^{ someView.alpha = (someView.alpha + 1.0) % 2; } completion:^(BOOL finished) { [self loopThisBlock]; }]; } What if the block is executed infinitely ?

Slide 49

Slide 49 text

AFNetworking callback block AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:@"http://example.com/resources.json" parameters:nil success:^ (AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }];

Slide 50

Slide 50 text

Notification handler block [[NSNotificationCenter defaultCenter] addObserverForNotificationName:@"NotificationName" object:nil queue:[NSOperationQueue mainQueue] block:^(NSNotification *notification) { //reload the table to show the new whiz bangs NSAssert(notification, @"Notification must not be nil"); [self.tableView reloadData]; }];

Slide 51

Slide 51 text

Usage

Slide 52

Slide 52 text

DSL Masonry Kiwi FTGValidator

Slide 53

Slide 53 text

DSL REQUIRE_STRING(@"90001").to.matchRegExWithPattern(@"^[0-9][0-9][0-9][0-9][0- 9]$").with.message(@"Value must be US zip code format"), [view1 mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(superview).with.insets(padding); }];

Slide 54

Slide 54 text

DSL - (FTGStringRule * (^)(NSString *anotherValue))equalTo { return ^(NSString *anotherValue){ [self setValidation:^BOOL(NSString *value) { return [value isEqualToString:anotherValue]; }]; return self; }; }

Slide 55

Slide 55 text

Syntactic sugar https://github.com/supermarin/ObjectiveSugar [@3 times:^{ NSLog(@"Hello!"); }]; [cars each:^(id object) { NSLog(@"Car: %@", object); }];

Slide 56

Slide 56 text

Syntactic sugar https://github.com/supermarin/ObjectiveSugar [@3 times:^{ NSLog(@"Hello!"); }]; [cars each:^(id object) { NSLog(@"Car: %@", object); }];

Slide 57

Slide 57 text

Condition http://blog.vikingosegundo.de/2012/10/05/pattern-switch-value-object/ NSArray *filter = @[caseYES, caseNO]; id obj1 = @"YES"; id obj2 = @"NO"; [obj1 processByPerformingFilterBlocks:filter]; [obj2 processByPerformingFilterBlocks:filter];

Slide 58

Slide 58 text

Mapping with block http://www.merowing.info/2014/03/refactoring-tricks/#.VNw2IlOUc8Y NSString *(^const format)(NSUInteger, NSString *, NSString *) = ^(NSUInteger value, NSString *singular, NSString *plural) { return [NSString stringWithFormat:@"%d %@", value, (value == 1 ? singular : plural)]; };

Slide 59

Slide 59 text

Reference 1. http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/ 2. https://blackpixel.com/writing/2014/03/capturing-myself.html 3. http://albertodebortoli.github.io/blog/2013/04/21/objective-c-blocks- under-the-hood/ 4. http://stackoverflow.com/questions/20134616/how-are-nsblock-objects- created 5. http://nilsou.com/blog/2013/08/21/objective-c-blocks-syntax/ 6. http://clang.llvm.org/docs/Block-ABI-Apple.html#blocks-as-objects 7. http://albertodebortoli.github.io/blog/2013/08/03/objective-c-blocks- caveat/

Slide 60

Slide 60 text

Thanks