SlideShare une entreprise Scribd logo
1  sur  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

Contenu connexe

Similaire à 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
 

Similaire à 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
 

Plus de 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
 

Plus de 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
 

Dernier

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 

Dernier (20)

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 

Design Patterns for Mobile Applications