Top Banner
Or how I learned to be less bad Intro to Obj-C Design Patterns Haris Amin
21

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

Jun 28, 2015

Download

Engineering

Haris Amin

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.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Intro to Obj-C Design Patterns or Or how I learned to be less bad

Or how I learned to be less bad

Intro to Obj-C Design Patterns

Haris Amin

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

GLIMPSE

A fun way to meet new people through

Instagram

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

Design Patterns• Why do we care?

• Let’s explore two design patterns in Cocoa

1. Notification Center

2. Delegates

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

Notification Center

• NSNotificationCenter class

• Easiest to learn (IMHO) but also easiest to abuse

• Very flexible

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

Notification Center

• Let’s Grab a NotificationCenter ‘instance’

!

• Then PUBLISH a specific message (2 ways)

[NSNotificationCenter defaultCenter]

1. With content

2. Without Content

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

Publish Message Without Content

• We want to notify that something specific ‘happened’

• Method Signature

- (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender

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

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];

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

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}];

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

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 // ... }

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

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

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

• 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

Page 12: Intro to Obj-C Design Patterns or Or how I learned to be less 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

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

A Personal Note…

• I consumed delegates without really understanding how they work

• I used to be scared of trying to implement one myself

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

TIME TO GAIN A SUPERPOWER!

Page 15: Intro to Obj-C Design Patterns or Or how I learned to be less 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

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

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

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

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

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

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

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

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

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

A parting note…

with great SUPER power comes great SUPER

responsibility!

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

Questions?

Cofounder/CO-CTO @itsglimpse

@harisamin

HARIS AMIN