Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intro to Obj-C Design Patterns or Or how I learned to be less bad

harisamin
August 29, 2014

Intro to Obj-C Design Patterns or Or how I learned to be less bad

Presented at A Swift Start on 08/29/2014:
A one day iOS community conference discussing
the ups and downs of learning iOS. Beginners and pros invited

An intro to two Objc-C/Cocoa design patterns: Notification Center and Delegates. The talk focuses on learning multiple ways to solve the problem while avoiding the 'chainsaw massacre' of one powerful approach over another.

harisamin

August 29, 2014
Tweet

More Decks by harisamin

Other Decks in Programming

Transcript

  1. Or how I learned to be less bad Intro to

    Obj-C Design Patterns Haris Amin
  2. Design Patterns • Why do we care? • Let’s explore

    two design patterns in Cocoa 1. Notification Center 2. Delegates
  3. Notification Center • Let’s Grab a NotificationCenter ‘instance’ ! •

    Then PUBLISH a specific message (2 ways) [NSNotificationCenter defaultCenter] 1. With content 2. Without Content
  4. Publish Message Without Content • We want to notify that

    something specific ‘happened’ • Method Signature - (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender
  5. Publish Message Without Content • E.G. The Video’s current time

    just updated - (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender [[NSNotificationCenter defaultCenter] postNotificationName:@"TimeUpdated" object:self];
  6. Publish Message With Content • E.G. The Video’s current time

    just updated WITH the actual current time - (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender userInfo:(NSDictionary *)userInfo [[NSNotificationCenter defaultCenter] postNotificationName:@"TimeUpdated" object:self userInfo:@{@"currentTime": 20}];
  7. Subscribing to a Message • In our VideoPlayer class we

    will just subscribe to the NotificationCenter Message - (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTimeUpdate:) name:@"TimeUpdated" object:nil]; - (void)handleTimeUpdate:(NSNotification *)note{ // note.userInfo is the CONTENT we passed // ... }
  8. Notification Center… THE GOOD • Really flexible • Don’t have

    to define any sort of protocol for your messages • You can subscribe and publish messages in any number of places
  9. • TOO flexible?! • Don’t have to define any sort

    of protocol for your messages • You can subscribe and publish messages in any number of of places Notification Center… THE BAD
  10. Delegates • Very solid pattern • Vigorously multitude of Cocoa

    classes (UITableView, UICollectionView, UIAlterView.. etc.) • You have to define the protocol of the messages you send
  11. A Personal Note… • I consumed delegates without really understanding

    how they work • I used to be scared of trying to implement one myself
  12. Delegates • Very solid pattern • Vigorously multitude of Cocoa

    classes (UITableView, UICollectionView, UIAlterView.. etc.) • You have to define the protocol of the messages you send
  13. Define a Delegate Protocol • Very solid pattern • Vigorously

    multitude of Cocoa classes (UITableView, UICollectionView, UIAlterView.. etc.) • You have to define the protocol of the messages you send
  14. Define Protocol @protocol VideoDelegate; ! @interface Video: NSObject ! @property

    (nonatomic, weak) id<VideoDelegate> delegate; ! @end ! @protocol VideoDelegate <NSObject> @required //... ! @optional -(void)video:(Video *)video updatedTime:(NSUInteger)currentTime; ! @end // end of delegate protocol
  15. Delegating Methods in the Protocol • In our Video class,

    where need be, we will delegate respective messages @implementation Video //.. ! if (self.delegate && [self.delegate respondsToSelector:@selector(video:updatedTime)]) { [self.delegate video:updatedTime]; } //.. @end
  16. Implement Protocol #include "Video.h" // needed to include the @delegate

    protocol info ! @interface VideoPlayer : UIViewController <VideoDelegate> @end ! @implementation VideoPlayer //.. ! -(void)video:(Video *)video updatedTime:(NSUInteger)currentTime{ // HURRAY! We know what the currentTime is :) } ! //.. @end