Block

 Block

How block works

16bebb36e0e28572a316ba0450e190d1?s=128

Khoa Pham

August 27, 2015
Tweet

Transcript

  1. Block Khoa Pham - 2359Media

  2. Block Definition Syntax Capture Usage

  3. Definition

  4. 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
  5. 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.
  6. Block struct + captured state information

  7. Syntax

  8. 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/
  9. Syntax * [] () ^

  10. 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/
  11. Syntax int a;

  12. Syntax int a; a is an int

  13. Syntax int *a;

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

  15. Syntax int a[];

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

  17. Syntax int f();

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

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

    int, and accepts a long
  20. Syntax int *a[];

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

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

    int
  23. Syntax int (*)a[];

  24. Syntax int (*)a[]; a is a pointer to an array

    of ints
  25. Syntax int *f();

  26. Syntax int *f(); f is function that returns a pointer

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

    to an int
  28. Syntax int (*f)();

  29. Syntax int (*f)(); f is a pointer to a function

    which accepts nothing and returns an int
  30. Syntax void (^successBlock)(NSDictionary *response); successBlock is a block pointer to

    a function which takes a dictionary and returns nothing
  31. Syntax ^ is the block pointer, which can only be

    applied to function int ^f(); // Error
  32. ^ unary operator int (^doubleMe)(int) = ^(int a){ return a

    * 2; } int b = doubleMe(2);
  33. ^ unary operator Transform function implementation into a block Infer

    the return type
  34. ^ unary operator BOOL (^customBlock)(NSArray *) = ^(NSArray *array) {

    // return array.count == 3; // Please don’t if (array.count == 3) { return YES; } return NO; };
  35. __block What does the block keyword mean http://stackoverflow.com/questions/7080927/what-does-the-block-keyword- mean

  36. __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,
  37. __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]; }); });
  38. Capture

  39. Capture The ability to capture values from the enclosing scope,

    making them similar to closures or lambdas in other programming languages.
  40. 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”
  41. weakSelf vs strongSelf Understand weakSelf and strongSelf http://www.fantageek. com/1090/understanding-weak-self-and- strong-self/

  42. 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
  43. weakSelf vs strongSelf Block captures the variable along with its

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

    decorators (i.e. weak qualifier),
  45. weakSelf vs strongSelf You should only use a weak reference

    to self, if self will hold on to a reference of the block.
  46. Take care

  47. 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!"); }];
  48. 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 ?
  49. 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); }];
  50. 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]; }];
  51. Usage

  52. DSL Masonry Kiwi FTGValidator

  53. 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); }];
  54. DSL - (FTGStringRule * (^)(NSString *anotherValue))equalTo { return ^(NSString *anotherValue){

    [self setValidation:^BOOL(NSString *value) { return [value isEqualToString:anotherValue]; }]; return self; }; }
  55. Syntactic sugar https://github.com/supermarin/ObjectiveSugar [@3 times:^{ NSLog(@"Hello!"); }]; [cars each:^(id object)

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

    { NSLog(@"Car: %@", object); }];
  57. 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];
  58. 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)]; };
  59. 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/
  60. Thanks