SlideShare a Scribd company logo
1 of 223
Design Patterns for
Mobile Apps
Thursday, June 13, 13
InfoQ.com: News & Community Site
• 750,000 unique visitors/month
• Published in 4 languages (English, Chinese, Japanese and Brazilian
Portuguese)
• Post content from our QCon conferences
• News 15-20 / week
• Articles 3-4 / week
• Presentations (videos) 12-15 / week
• Interviews 2-3 / week
• Books 1 / month
Watch the video with slide
synchronization on InfoQ.com!
http://www.infoq.com/presentations
/mobile-design-patterns
Presented at QCon New York
www.qconnewyork.com
Purpose of QCon
- to empower software development by facilitating the spread of
knowledge and innovation
Strategy
- practitioner-driven conference designed for YOU: influencers of
change and innovation in your teams
- speakers and topics driving the evolution and innovation
- connecting and catalyzing the influencers and innovators
Highlights
- attended by more than 12,000 delegates since 2007
- held in 9 cities worldwide
Cocoa Design Patterns
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
NSBrief
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Hawtness
Thursday, June 13, 13
853 apps per day
148apps.biz
January 2013
Thursday, June 13, 13
133 games per day
148apps.biz
January 2013
Thursday, June 13, 13
Quality Takes Time
Thursday, June 13, 13
Time == $$$
Thursday, June 13, 13
Time Tested Solutions
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Let’s Build a
Mobile App
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
View
Controller
Model
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
MVC
Thursday, June 13, 13
Model View Controller
Thursday, June 13, 13
Model View Controller
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
@interface Post : _Post
+ (id) postWithId:(NSNumber *)postId;
- (void) downloadAttachments;
@end
Thursday, June 13, 13
Model View Controller
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Model View Controller
Thursday, June 13, 13
?
Thursday, June 13, 13
MVC
Thursday, June 13, 13
MVC
Thursday, June 13, 13
View
ViewController
Model
View
ViewController
View
ViewController
Thursday, June 13, 13
View
ViewController
Model
View
ViewController
View
ViewController
Thursday, June 13, 13
View
ViewController
Model
Thursday, June 13, 13
MVC can be composed of
MVC (UITextView for
example)
View
ViewController
Model
Thursday, June 13, 13
MVC can be composed of
MVC (UITextView for
example)
Database
Visual Control
Network
App.net
View
ViewController
Model
Thursday, June 13, 13
DatabaseVisual Control
Network App.net
ViewController
Thursday, June 13, 13
DatabaseVisual Control
Network App.net
ViewController
Thursday, June 13, 13
Thursday, June 13, 13
AppDelegate
Thursday, June 13, 13
AppDelegate
RootViewController
Thursday, June 13, 13
AppDelegate
RootViewController
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewControlle
wController
iewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewControllerViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
wController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewControlle
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewCo
ViewContr
ViewController
ViewCon
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
ViewController
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
App.net
Thursday, June 13, 13
(MyAppDelegate *)[[UIApplication
sharedApplication] delegate]
Thursday, June 13, 13
#define sharedDelegate 
(MyAppDelegate *)[[UIApplication sharedApplication] delegate]
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
App.net
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
App.net
message
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
App.net
message
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
App.net
message
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
App.net
message
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
App.netmessage
Thursday, June 13, 13
AppDelegate
RootViewController
ViewController
ViewController
ViewController
ViewController
App.netmessage
Thursday, June 13, 13
Chain of Responsibility
Pause here more, explain
more :
What
When to use
Why
Thursday, June 13, 13
Responder Chain
Thursday, June 13, 13
[[UIApplication
sharedApplication]
sendAction:to:from:forEvent:]
Thursday, June 13, 13
@implementation UIView
(FindAndResignFirstResponder)
- (BOOL)findAndResignFirstResponder
{
if ([self isFirstResponder]) {
[self resignFirstResponder];
return YES;
}
for (UIView *subView in [self subviews]) {
if ([subView findAndResignFirstResponder])
return YES;
}
return NO;
}
@end
Thursday, June 13, 13
while ([obj retainCount]) [obj release];
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
[[UIApplication sharedApplication]
sendAction:@selector(resignFirstResponder)
to:nil
from:self
forEvent:nil]
Thursday, June 13, 13
[[UIApplication sharedApplication]
sendAction:@selector(resignFirstResponder)
to:nil
from:self
forEvent:nil]
Thursday, June 13, 13
- (void)viewDidAppear:
Thursday, June 13, 13
AppDelegate
RVC
VC
View
Thursday, June 13, 13
AppDelegate
RVC
VC
View
Thursday, June 13, 13
AppDelegate
RVC
VC
View
VC
View
Thursday, June 13, 13
AppDelegate
RVC
VC
View
VC
View
Thursday, June 13, 13
AppDelegate
RVC
VC
View
VC
View
Thursday, June 13, 13
Command
Thursday, June 13, 13
Thursday, June 13, 13
- (void)viewDidLoad {
[super viewDidLoad];
// Setting Up Table View
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.bounds.size.width,
self.view.bounds.size.height) style:UITableViewStylePlain];
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.tableView.hidden = YES;
[self.view addSubview:self.tableView];
// Setting Up Activity Indicator View
self.activityIndicatorView = [[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
self.activityIndicatorView.hidesWhenStopped = YES;
self.activityIndicatorView.center = self.view.center;
[self.view addSubview:self.activityIndicatorView];
[self.activityIndicatorView startAnimating];
// Initializing Data Source
self.movies = [[NSArray alloc] init];
NSURL *url = [[NSURL alloc] initWithString:@"http://itunes.apple.com/search?term=harry&country=us&entity=movie"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
self.movies = [JSON objectForKey:@"results"];
[self.activityIndicatorView stopAnimating];
[self.tableView setHidden:NO];
[self.tableView reloadData];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
}];
[operation start];
}
Thursday, June 13, 13
- (void)viewDidLoad {
[super viewDidLoad];
// Setting Up Table View
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.bounds.size.width,
self.view.bounds.size.height) style:UITableViewStylePlain];
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.tableView.hidden = YES;
[self.view addSubview:self.tableView];
// Setting Up Activity Indicator View
self.activityIndicatorView = [[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
self.activityIndicatorView.hidesWhenStopped = YES;
self.activityIndicatorView.center = self.view.center;
[self.view addSubview:self.activityIndicatorView];
[self.activityIndicatorView startAnimating];
// Initializing Data Source
self.movies = [[NSArray alloc] init];
NSURL *url = [[NSURL alloc] initWithString:@"http://itunes.apple.com/search?term=harry&country=us&entity=movie"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
self.movies = [JSON objectForKey:@"results"];
[self.activityIndicatorView stopAnimating];
[self.tableView setHidden:NO];
[self.tableView reloadData];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
}];
[operation start];
}
Thursday, June 13, 13
// Initializing Data Source
self.movies = [[NSArray alloc] init];
NSURL *url = [[NSURL alloc] initWithString:@"http://itunes.apple.com/search?
term=harry&country=us&entity=movie"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation
JSONRequestOperationWithRequest:request success:^(NSURLRequest *request,
NSHTTPURLResponse *response, id JSON) {
self.movies = [JSON objectForKey:@"results"];
[self.activityIndicatorView stopAnimating];
[self.tableView setHidden:NO];
[self.tableView reloadData];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError
*error, id JSON) {
NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
}];
[operation start];
Thursday, June 13, 13
// Initializing Data Source
self.movies = [[NSArray alloc] init];
NSURL *url = [[NSURL alloc] initWithString:@"http://itunes.apple.com/search?
term=harry&country=us&entity=movie"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation
JSONRequestOperationWithRequest:request success:^(NSURLRequest *request,
NSHTTPURLResponse *response, id JSON) {
self.movies = [JSON objectForKey:@"results"];
[self.activityIndicatorView stopAnimating];
[self.tableView setHidden:NO];
[self.tableView reloadData];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError
*error, id JSON) {
NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
}];
[operation start];
Thursday, June 13, 13
^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
self.movies = [JSON objectForKey:@"results"];
[self.activityIndicatorView stopAnimating];
[self.tableView setHidden:NO];
[self.tableView reloadData];
}
Thursday, June 13, 13
ADN Service
Thursday, June 13, 13
ADN Service
https://alpha-api.app.net/stream/0/posts/stream
Thursday, June 13, 13
ADN Service
https://alpha-api.app.net/stream/0/posts/stream
Thursday, June 13, 13
ADN Service
https://alpha-api.app.net/stream/0/posts/stream
POST:
include_reposters=1&include_annotations=1&incl
ude_muted=0&include_starred_by=1
Thursday, June 13, 13
ADN Service
Get Personal Stream
Thursday, June 13, 13
ADN Service
Get Personal Stream
include_reposters
include_muted
include_annotations
include_starred_by
Thursday, June 13, 13
ADN Service
Get Personal Stream
Thursday, June 13, 13
ADN Service
Get Personal Stream
Thursday, June 13, 13
ADN Service
Get Personal Stream
@property (nonatomic, assign) BOOL includeReposters
@property (nonatomic, assign) BOOL includeAnnotations
@property (nonatomic, assign) BOOL includeStarredBy
@property (nonatomic, assign) BOOL includeMuted
Thursday, June 13, 13
ADN Service
@class ADNRetrievePersonalStreamCommand : ADNCommand
@property (nonatomic, assign) BOOL includeReposters
@property (nonatomic, assign) BOOL includeAnnotations
@property (nonatomic, assign) BOOL includeStarredBy
@property (nonatomic, assign) BOOL includeMuted
Thursday, June 13, 13
ADN Service
@class ADNRetrievePersonalStreamCommand : ADNCommand
@property (nonatomic, assign) BOOL includeReposters
@property (nonatomic, assign) BOOL includeAnnotations
@property (nonatomic, assign) BOOL includeStarredBy
@property (nonatomic, assign) BOOL includeMuted
@property (nonatomic, copy) NSURL *baseURL;
@class ADNService : UIResponder
Thursday, June 13, 13
Get Personal Stream
ADN Service
Thursday, June 13, 13
Get Personal StreamADN Service
Thursday, June 13, 13
Command
Thursday, June 13, 13
ADNCommand
Thursday, June 13, 13
ADNCommand
Thursday, June 13, 13
ADNPersonalStreamCommand
ADNCommand
Thursday, June 13, 13
ADNPersonalStreamCommand
ADNCommand
Thursday, June 13, 13
ADNPersonalStreamCommand
ADNCommand
Thursday, June 13, 13
ADNPersonalStreamCommand
ADNPostStatusCommand
ADNRetrieveChannelCommand
ADNUserLookupCommand
ADNCommand
Thursday, June 13, 13
Template
Thursday, June 13, 13
Thursday, June 13, 13
//AppDelegate.h
@interface AppDelegate : UIResponder<UIApplicationDelegate>
@property (nonatomic, strong, readwrite) IBOutlet UIWindow *window;
@property (nonatomic, strong, readonly) WebService *webService;
@end
//AppDelegate.m
- (UIResponder *)nextResponder;
{
return self.webService;
}
Thursday, June 13, 13
@interface WebService : UIResponder
@property (nonatomic, copy, readonly) NSURL *baseURL;
@property (nonatomic, strong, readonly) TokenStorage *tokenStorage;
//..more properties
- (id) initWithBaseURL:(NSURL *)baseURL;
- (void) sendCommand:(WebServiceCommand *)command;
- (void) presentMessageFromCommand:(NSString *)message;
- (BOOL) isAuthenticated;
- (BOOL) performAction:(SEL)action from:(id)sender;
- (BOOL) performAction:(SEL)action from:(id)sender parameters:
(NSDictionary *)parameters;
+ (BOOL) isNetworkReachable;
@end
Thursday, June 13, 13
@interface WebService (Commands)
- (IBAction) loginToService;
- (IBAction) logoutFromService;
- (IBAction) retrieveUsersPersonalStream:(id)sender;
@end
Thursday, June 13, 13
- (void) loginToService
{
WebServiceLoginCommand *command = [WebServiceLoginCommand
commandWithService:self];
command.tokenStorage = self.tokenStorage;
command.username = [self.delegate username];
command.password = [self.delegate password];
[command send];
}
Thursday, June 13, 13
- (NSString *)username;
{
return [self textValueForCellAtIndexPath:[NSIndexPath
indexPathForRow:0 inSection:0]];
}
- (NSString *)password;
{
return [[self textValueForCellAtIndexPath:[NSIndexPath
indexPathForRow:1 inSection:0]] lowercaseString];
}
- (IBAction) login:(id)sender;
{
if ([[self username] length] && [[self password] length])
{
self.messageLabel.text = @"";
[[UIApplication sharedApplication]
performActionInResponderChain:@selector(resignFirstResponder)
from:self];
[SVProgressHUD showWithStatus:@"Logging in..."
maskType:SVProgressHUDMaskTypeBlack];
}
}
Thursday, June 13, 13
- (void) sendCommand:(WebServiceCommand *)command;
{
BOOL commandVerified = [self verifyCommand:command];
if (!commandVerified) return;
if ([self.httpClient networkReachabilityStatus] ==
AFNetworkReachabilityStatusNotReachable)
{
[self.delegate displayMessage:@"No Internet Connection"];
DDLogInfo(@"Not connected to a network");
}
else
{
AFHTTPRequestOperation *operation = [command createRequestOperation];
[self.httpClient enqueueHTTPRequestOperation:operation];
DDLogInfo(@"Sent Command: %@", command);
}
}
Thursday, June 13, 13
- (void) sendCommand:(WebServiceCommand *)command;
{
BOOL commandVerified = [self verifyCommand:command];
if (!commandVerified) return;
if ([self.httpClient networkReachabilityStatus] ==
AFNetworkReachabilityStatusNotReachable)
{
[self.delegate displayMessage:@"No Internet Connection"];
DDLogInfo(@"Not connected to a network");
}
else
{
AFHTTPRequestOperation *operation = [command createRequestOperation];
[self.httpClient enqueueHTTPRequestOperation:operation];
DDLogInfo(@"Sent Command: %@", command);
}
}
Thursday, June 13, 13
- (void) sendCommand:(WebServiceCommand *)command;
{
BOOL commandVerified = [self verifyCommand:command];
if (!commandVerified) return;
if ([self.httpClient networkReachabilityStatus] ==
AFNetworkReachabilityStatusNotReachable)
{
[self.delegate displayMessage:@"No Internet Connection"];
DDLogInfo(@"Not connected to a network");
}
else
{
AFHTTPRequestOperation *operation = [command createRequestOperation];
[self.httpClient enqueueHTTPRequestOperation:operation];
DDLogInfo(@"Sent Command: %@", command);
}
}
Thursday, June 13, 13
[self.delegate displayMessage:@"No Internet Connection"];
DDLogInfo(@"Not connected to a network");
Thursday, June 13, 13
AFHTTPRequestOperation *operation = [command
createRequestOperation];
[self.httpClient enqueueHTTPRequestOperation:operation];
DDLogInfo(@"Sent Command: %@", command);
Thursday, June 13, 13
ommand
Object
WebService Object
Our App
Actual
Service
Thursday, June 13, 13
WebService Object
Our App HTTP Requ
Actual
Service
Thursday, June 13, 13
HTTP
Respons
WebService Object
Our App
Actual
Service
Thursday, June 13, 13
WebService Object
ble ObjectOur App
Actual
Service
Thursday, June 13, 13
Usable Object
Needs to be more clear
Thursday, June 13, 13
Needs to be more clear
Usable Object
Thursday, June 13, 13
Thursday, June 13, 13
NSFetchedResultsController
Thursday, June 13, 13
- (void) loadUserStream;
{
self.results = [StreamEvent MR_fetchAllSortedBy:StreamEvent.createdDate
ascending:YES
withPredicate:[self streamFilter]
groupBy:nil
delegate:self
inContext:self.context];
}
Thursday, June 13, 13
- (void) loadUserStream;
{
self.results = [StreamEvent MR_fetchAllSortedBy:StreamEvent.createdDate
ascending:YES
withPredicate:[self streamFilter]
groupBy:nil
delegate:self
inContext:self.context];
}
Thursday, June 13, 13
NSFetchedResultsControllerDelegate
Thursday, June 13, 13
Delegation
Thursday, June 13, 13
AbstractTemplate
ConcreteTemplate
Thursday, June 13, 13
AbstractTemplate
ConcreteTemplate
Thursday, June 13, 13
AbstractTemplate ConcreteTemplate
Thursday, June 13, 13
AbstractTemplate ConcreteTemplate
Thursday, June 13, 13
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)theIndexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
- (void)controllerWillChangeContent:(NSFetchedResultsController
*)controller
- (void)controllerDidChangeContent:(NSFetchedResultsController
*)controller
Thursday, June 13, 13
switch(type)
{
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:@[theIndexPath]
withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeDelete:
[self verifyProductPredicate:anObject];
[tableView deleteRowsAtIndexPaths:@[theIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
{
id object = [self.results objectAtIndexPath:theIndexPath];
[self configureCell:(id)[tableView
cellForRowAtIndexPath:theIndexPath] forObject:object];
}
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:@[theIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:@[theIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
}
Thursday, June 13, 13
Observer
Last steps from
controller to view with
observer pattern
Thursday, June 13, 13
Model
Controller
View
Thursday, June 13, 13
Composite
Command
Mediator
Strategy
Observer
Thursday, June 13, 13
Model
ViewController
View
Thursday, June 13, 13
Model
ViewController
View
Thursday, June 13, 13
Model
ViewController
View
Thursday, June 13, 13
Model
ViewController
View
Thursday, June 13, 13
Model
ViewController
View
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Touch Interface
View
ViewController
App.net App.net
AppDelegate CoreData
Thursday, June 13, 13
Pattern Abuse
Thursday, June 13, 13
Factory
Thursday, June 13, 13
Abstract Factories
Thursday, June 13, 13
Two-Stage Creation
Thursday, June 13, 13
[[MyClass alloc] init]
Thursday, June 13, 13
NSClassFromString
Thursday, June 13, 13
[NSClassFromString(@”MyClass”) alloc] init]
Thursday, June 13, 13
Singletons
More explanation in
slides
Thursday, June 13, 13
Singletons
More explanation in
slides
Thursday, June 13, 13
More explanation in
slides
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Singleton
ViewController AppDelegate
Thursday, June 13, 13
Singleton
ViewController AppDelegate
Thursday, June 13, 13
Singleton
ViewController
AppDelegate
Model ObjectNetwork
Web Service
Thursday, June 13, 13
Singleton
ViewController
AppDelegate
Model ObjectNetwork
Web Service
Thursday, June 13, 13
Singleton
ViewController
AppDelegate
Model ObjectNetwork
Web Service
Thursday, June 13, 13
Singleton
ViewController
AppDelegate
Model ObjectNetwork
Web ServiceWeb ServiceWeb Service
ViewControllerViewControllerViewControllerViewControllerViewController
Model ObjectModel ObjectModel ObjectModel ObjectModel ObjectModel Object
Thursday, June 13, 13
Singleton
Thursday, June 13, 13
Singleton
Thursday, June 13, 13
AppDelegate
Thursday, June 13, 13
Singleton Manager
AppDelegate
Thursday, June 13, 13
Singleton Manager
AppDelegate
Singleton
Singleton
Singleton
Thursday, June 13, 13
Singleton ManagerAppDelegate
-instanceForClass:[Singleton class]
Thursday, June 13, 13
Singleton ManagerAppDelegate
Thursday, June 13, 13
Singleton ManagerAppDelegate
-destroyInstanceForClass:[Singleton class]
Thursday, June 13, 13
Singleton ManagerAppDelegate
Thursday, June 13, 13
SingletonSingleton ManagerAppDelegate
ViewController
Thursday, June 13, 13
Singleton
Singleton ManagerAppDelegate
ViewController
Thursday, June 13, 13
ServiceLocator
Thursday, June 13, 13
Classes are objects too...
Thursday, June 13, 13
@property Class dateCreator;
Thursday, June 13, 13
[self.dateCreator date];
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
Thursday, June 13, 13
It was important, his
father said, to craft the
backs of cabinets and
fences properly, even
though they were hidden.
Steve Jobs by Walter Isaacson
Thursday, June 13, 13
“He loved doing things
right. He even cared
about the look of the
parts you couldn’t see.”
- Steve Jobs
Thursday, June 13, 13
saul@magicalpanda.com
Thursday, June 13, 13

More Related Content

Similar to Design Patterns for Mobile Applications

Writing SaltStack Modules - OpenWest 2013
Writing SaltStack Modules - OpenWest 2013Writing SaltStack Modules - OpenWest 2013
Writing SaltStack Modules - OpenWest 2013SaltStack
 
What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...Richard McIntyre
 
Silicon Straits Foundry - Product Development Services Deck - 2014
Silicon Straits Foundry - Product Development Services Deck - 2014Silicon Straits Foundry - Product Development Services Deck - 2014
Silicon Straits Foundry - Product Development Services Deck - 2014Silicon Straits
 
Engineering culture
Engineering cultureEngineering culture
Engineering culturePamela Fox
 
Focus Management and Accessibility on iOS, Android, and HTML5
Focus Management and Accessibility on iOS, Android, and HTML5Focus Management and Accessibility on iOS, Android, and HTML5
Focus Management and Accessibility on iOS, Android, and HTML5Ted Drake
 
Troubleshooting Live Java Web Applications
Troubleshooting Live Java Web ApplicationsTroubleshooting Live Java Web Applications
Troubleshooting Live Java Web Applicationsashleypuls
 
Beyond DOM Manipulations: Building Stateful Modules with Events and Promises
Beyond DOM Manipulations: Building Stateful Modules with Events and PromisesBeyond DOM Manipulations: Building Stateful Modules with Events and Promises
Beyond DOM Manipulations: Building Stateful Modules with Events and PromisesCrashlytics
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AnglePablo Godel
 
Beyond VoiceOver: making iOS apps accessible
Beyond VoiceOver: making iOS apps accessibleBeyond VoiceOver: making iOS apps accessible
Beyond VoiceOver: making iOS apps accessibleSally Shepard
 
Developing a Demo Application with Angular 4 - J2I
Developing a Demo Application with Angular 4 - J2IDeveloping a Demo Application with Angular 4 - J2I
Developing a Demo Application with Angular 4 - J2INader Debbabi
 
EduWeb - Building a Responsive Website for the Presidential Debate
EduWeb - Building a Responsive Website for the Presidential DebateEduWeb - Building a Responsive Website for the Presidential Debate
EduWeb - Building a Responsive Website for the Presidential DebateJon Liu
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkJeremy Kendall
 
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and MobileOpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and MobileDierk König
 
1021 smap01 social media apps programming
1021 smap01 social media apps programming1021 smap01 social media apps programming
1021 smap01 social media apps programmingimyday
 
Smart Mirror Summer Report
Smart Mirror Summer ReportSmart Mirror Summer Report
Smart Mirror Summer ReportJabari Barton
 
1021 smap01 social media apps programming
1021 smap01 social media apps programming1021 smap01 social media apps programming
1021 smap01 social media apps programmingimyday
 
Eclipse Orion: The IDE in the Clouds (JavaOne 2013)
Eclipse Orion: The IDE in the Clouds (JavaOne 2013)Eclipse Orion: The IDE in the Clouds (JavaOne 2013)
Eclipse Orion: The IDE in the Clouds (JavaOne 2013)Murat Yener
 
Open Source Portal and Mobile Solutions
Open Source Portal and Mobile SolutionsOpen Source Portal and Mobile Solutions
Open Source Portal and Mobile SolutionsAaron Grant
 
Platform Independent App design
Platform Independent App designPlatform Independent App design
Platform Independent App designArnab Pradhan
 

Similar to Design Patterns for Mobile Applications (20)

Angular from Scratch
Angular from ScratchAngular from Scratch
Angular from Scratch
 
Writing SaltStack Modules - OpenWest 2013
Writing SaltStack Modules - OpenWest 2013Writing SaltStack Modules - OpenWest 2013
Writing SaltStack Modules - OpenWest 2013
 
What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...What is this DI and AOP stuff anyway...
What is this DI and AOP stuff anyway...
 
Silicon Straits Foundry - Product Development Services Deck - 2014
Silicon Straits Foundry - Product Development Services Deck - 2014Silicon Straits Foundry - Product Development Services Deck - 2014
Silicon Straits Foundry - Product Development Services Deck - 2014
 
Engineering culture
Engineering cultureEngineering culture
Engineering culture
 
Focus Management and Accessibility on iOS, Android, and HTML5
Focus Management and Accessibility on iOS, Android, and HTML5Focus Management and Accessibility on iOS, Android, and HTML5
Focus Management and Accessibility on iOS, Android, and HTML5
 
Troubleshooting Live Java Web Applications
Troubleshooting Live Java Web ApplicationsTroubleshooting Live Java Web Applications
Troubleshooting Live Java Web Applications
 
Beyond DOM Manipulations: Building Stateful Modules with Events and Promises
Beyond DOM Manipulations: Building Stateful Modules with Events and PromisesBeyond DOM Manipulations: Building Stateful Modules with Events and Promises
Beyond DOM Manipulations: Building Stateful Modules with Events and Promises
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New Angle
 
Beyond VoiceOver: making iOS apps accessible
Beyond VoiceOver: making iOS apps accessibleBeyond VoiceOver: making iOS apps accessible
Beyond VoiceOver: making iOS apps accessible
 
Developing a Demo Application with Angular 4 - J2I
Developing a Demo Application with Angular 4 - J2IDeveloping a Demo Application with Angular 4 - J2I
Developing a Demo Application with Angular 4 - J2I
 
EduWeb - Building a Responsive Website for the Presidential Debate
EduWeb - Building a Responsive Website for the Presidential DebateEduWeb - Building a Responsive Website for the Presidential Debate
EduWeb - Building a Responsive Website for the Presidential Debate
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro framework
 
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and MobileOpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
OpenDolphin: Enterprise Apps for collaboration on Desktop, Web, and Mobile
 
1021 smap01 social media apps programming
1021 smap01 social media apps programming1021 smap01 social media apps programming
1021 smap01 social media apps programming
 
Smart Mirror Summer Report
Smart Mirror Summer ReportSmart Mirror Summer Report
Smart Mirror Summer Report
 
1021 smap01 social media apps programming
1021 smap01 social media apps programming1021 smap01 social media apps programming
1021 smap01 social media apps programming
 
Eclipse Orion: The IDE in the Clouds (JavaOne 2013)
Eclipse Orion: The IDE in the Clouds (JavaOne 2013)Eclipse Orion: The IDE in the Clouds (JavaOne 2013)
Eclipse Orion: The IDE in the Clouds (JavaOne 2013)
 
Open Source Portal and Mobile Solutions
Open Source Portal and Mobile SolutionsOpen Source Portal and Mobile Solutions
Open Source Portal and Mobile Solutions
 
Platform Independent App design
Platform Independent App designPlatform Independent App design
Platform Independent App design
 

More from C4Media

Streaming a Million Likes/Second: Real-Time Interactions on Live Video
Streaming a Million Likes/Second: Real-Time Interactions on Live VideoStreaming a Million Likes/Second: Real-Time Interactions on Live Video
Streaming a Million Likes/Second: Real-Time Interactions on Live VideoC4Media
 
Next Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy MobileNext Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy MobileC4Media
 
Software Teams and Teamwork Trends Report Q1 2020
Software Teams and Teamwork Trends Report Q1 2020Software Teams and Teamwork Trends Report Q1 2020
Software Teams and Teamwork Trends Report Q1 2020C4Media
 
Understand the Trade-offs Using Compilers for Java Applications
Understand the Trade-offs Using Compilers for Java ApplicationsUnderstand the Trade-offs Using Compilers for Java Applications
Understand the Trade-offs Using Compilers for Java ApplicationsC4Media
 
Kafka Needs No Keeper
Kafka Needs No KeeperKafka Needs No Keeper
Kafka Needs No KeeperC4Media
 
High Performing Teams Act Like Owners
High Performing Teams Act Like OwnersHigh Performing Teams Act Like Owners
High Performing Teams Act Like OwnersC4Media
 
Does Java Need Inline Types? What Project Valhalla Can Bring to Java
Does Java Need Inline Types? What Project Valhalla Can Bring to JavaDoes Java Need Inline Types? What Project Valhalla Can Bring to Java
Does Java Need Inline Types? What Project Valhalla Can Bring to JavaC4Media
 
Service Meshes- The Ultimate Guide
Service Meshes- The Ultimate GuideService Meshes- The Ultimate Guide
Service Meshes- The Ultimate GuideC4Media
 
Shifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CDShifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CDC4Media
 
CI/CD for Machine Learning
CI/CD for Machine LearningCI/CD for Machine Learning
CI/CD for Machine LearningC4Media
 
Fault Tolerance at Speed
Fault Tolerance at SpeedFault Tolerance at Speed
Fault Tolerance at SpeedC4Media
 
Architectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep SystemsArchitectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep SystemsC4Media
 
ML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.jsML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.jsC4Media
 
Build Your Own WebAssembly Compiler
Build Your Own WebAssembly CompilerBuild Your Own WebAssembly Compiler
Build Your Own WebAssembly CompilerC4Media
 
User & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix ScaleUser & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix ScaleC4Media
 
Scaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's EdgeScaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's EdgeC4Media
 
Make Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home EverywhereMake Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home EverywhereC4Media
 
The Talk You've Been Await-ing For
The Talk You've Been Await-ing ForThe Talk You've Been Await-ing For
The Talk You've Been Await-ing ForC4Media
 
Future of Data Engineering
Future of Data EngineeringFuture of Data Engineering
Future of Data EngineeringC4Media
 
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and MoreAutomated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and MoreC4Media
 

More from C4Media (20)

Streaming a Million Likes/Second: Real-Time Interactions on Live Video
Streaming a Million Likes/Second: Real-Time Interactions on Live VideoStreaming a Million Likes/Second: Real-Time Interactions on Live Video
Streaming a Million Likes/Second: Real-Time Interactions on Live Video
 
Next Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy MobileNext Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy Mobile
 
Software Teams and Teamwork Trends Report Q1 2020
Software Teams and Teamwork Trends Report Q1 2020Software Teams and Teamwork Trends Report Q1 2020
Software Teams and Teamwork Trends Report Q1 2020
 
Understand the Trade-offs Using Compilers for Java Applications
Understand the Trade-offs Using Compilers for Java ApplicationsUnderstand the Trade-offs Using Compilers for Java Applications
Understand the Trade-offs Using Compilers for Java Applications
 
Kafka Needs No Keeper
Kafka Needs No KeeperKafka Needs No Keeper
Kafka Needs No Keeper
 
High Performing Teams Act Like Owners
High Performing Teams Act Like OwnersHigh Performing Teams Act Like Owners
High Performing Teams Act Like Owners
 
Does Java Need Inline Types? What Project Valhalla Can Bring to Java
Does Java Need Inline Types? What Project Valhalla Can Bring to JavaDoes Java Need Inline Types? What Project Valhalla Can Bring to Java
Does Java Need Inline Types? What Project Valhalla Can Bring to Java
 
Service Meshes- The Ultimate Guide
Service Meshes- The Ultimate GuideService Meshes- The Ultimate Guide
Service Meshes- The Ultimate Guide
 
Shifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CDShifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CD
 
CI/CD for Machine Learning
CI/CD for Machine LearningCI/CD for Machine Learning
CI/CD for Machine Learning
 
Fault Tolerance at Speed
Fault Tolerance at SpeedFault Tolerance at Speed
Fault Tolerance at Speed
 
Architectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep SystemsArchitectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep Systems
 
ML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.jsML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.js
 
Build Your Own WebAssembly Compiler
Build Your Own WebAssembly CompilerBuild Your Own WebAssembly Compiler
Build Your Own WebAssembly Compiler
 
User & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix ScaleUser & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix Scale
 
Scaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's EdgeScaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's Edge
 
Make Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home EverywhereMake Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home Everywhere
 
The Talk You've Been Await-ing For
The Talk You've Been Await-ing ForThe Talk You've Been Await-ing For
The Talk You've Been Await-ing For
 
Future of Data Engineering
Future of Data EngineeringFuture of Data Engineering
Future of Data Engineering
 
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and MoreAutomated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
 

Recently uploaded

UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 

Recently uploaded (20)

UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 

Design Patterns for Mobile Applications