intro to obj-c design patterns or or how i learned to be less bad
DESCRIPTION
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.TRANSCRIPT
Or how I learned to be less bad
Intro to Obj-C Design Patterns
Haris Amin
GLIMPSE
A fun way to meet new people through
Design Patterns• Why do we care?
• Let’s explore two design patterns in Cocoa
1. Notification Center
2. Delegates
Notification Center
• NSNotificationCenter class
• Easiest to learn (IMHO) but also easiest to abuse
• Very flexible
Notification Center
• Let’s Grab a NotificationCenter ‘instance’
!
• Then PUBLISH a specific message (2 ways)
[NSNotificationCenter defaultCenter]
1. With content
2. Without Content
Publish Message Without Content
• We want to notify that something specific ‘happened’
• Method Signature
- (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender
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];
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}];
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 // ... }
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
• 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
Delegates
• Very solid pattern
• Vigorously multitude of Cocoa classes (UITableView, UICollectionView, UIAlterView.. etc.)
• You have to define the protocol of the messages you send
A Personal Note…
• I consumed delegates without really understanding how they work
• I used to be scared of trying to implement one myself
TIME TO GAIN A SUPERPOWER!
Delegates
• Very solid pattern
• Vigorously multitude of Cocoa classes (UITableView, UICollectionView, UIAlterView.. etc.)
• You have to define the protocol of the messages you send
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
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
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
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
A parting note…
with great SUPER power comes great SUPER
responsibility!
Questions?
Cofounder/CO-CTO @itsglimpse
@harisamin
HARIS AMIN