ParseThomas Bouldin @inlined
Which is better:

To expend great effort

Or achieve great results?
Making mobile apps is hard
Database REST API
Z
Z
Z
Server
++
+ users
+ security
CachingNetworking
+ +
The fun part!
no no
no
no
no
yes!
Parse Pillars
Push AnalyticsCore
Parse Core
Storing Data
Parse Data
PFObject is like an NSMutableDictionary in the cloud

PFObject *armor = [PFObject objectWithClassName:@“Armor”];

[armor setObject:@“Shield” forKey:@“name”];

armor[@“price”] = @50;

[armor saveInBackground];
Storing Data
Parse Data
!


Armor	
  *shield	
  =	
  [Armor	
  object]

shield.name	
  =	
  @“shield”;

shield.cost	
  =	
  50;
Can also use like a class:
Fetching Data
Parse Data
PFQuery	
  *query	
  =	
  [Armor	
  query];	
  
[query	
  whereKey:@“name”	
  equalTo:@“shield”];

[query	
  whereKey:@“cost”	
  lessThan:@50];	
  
[query	
  findObjectsInBackgroundWithBlock:

	
  	
  ^(NSArray	
  *objects,	
  NSError	
  *error)	
  {

	
  	
  /*	
  ...	
  */

}];
Signing Up
Parse Social
PFUser	
  *user	
  =	
  [PFUser	
  user];	
  
user.username	
  =	
  @“inlined”;

user.password	
  =	
  @“YC	
  H4cks”;	
  
[user	
  signUpInBackgroundWithBlock:

	
  ^(BOOL	
  success,	
  NSError	
  *error)	
  {

	
  	
  /*	
  ...	
  */

}];
Social Integration
Parse Social
[PFFacebookUtils	
  logInWithPermissions:nil

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  block:

	
  ^(PFUser	
  *user,	
  NSError	
  *error)	
  {

	
  	
  /*	
  ...	
  */

}];
UI Controls
Parse Social
Replace login code with built-in view

controllers

Fully customizable
Parse Cloud Code
For when server-side code is needed or easier

Trusted execution environment

Data pipeline integration

Third party integration

Hosting static and dynamic resources
Parse Cloud Code
Parse.Cloud.afterSave(

	
  	
  	
  	
  “Message”,	
  function(request)	
  {	
  
	
  	
  	
  	
  Parse.Push.send({

	
  	
  	
  	
  	
  	
  channel:	
  request.object.get(“room”),

	
  	
  	
  	
  	
  	
  data:	
  {

	
  	
  	
  	
  	
  	
  	
  	
  alert:	
  request.object.get(“message”)

	
  	
  	
  	
  	
  	
  }

	
  	
  	
  	
  });

});
Parse Push
Registering
Parse Push
[PFPush	
  storeDeviceToken:deviceToken];	
  
[PFPush	
  subscribeToChannelInBackground:@“hack”];
Sending
Parse Push
PFPush	
  *push	
  =	
  [PFPush	
  push];	
  
push.channel	
  =	
  @“hack”;	
  
push.message	
  =	
  @“Move	
  fast	
  and	
  build	
  things”;	
  
[push	
  sendInBackgroundWithBlock:

	
  	
  ^(BOOL	
  succeeded,	
  NSError	
  *error)	
  {

	
  	
  /*	
  ...	
  */

}];
Parse Analytics
App Opens
Parse Analytics
	
  [PFAnalytics

	
  	
  	
  	
  trackAppOpenedWithLaunchOptions:launchOptions];
Custom Events
Parse Analytics
NSDictionary	
  *dimensions	
  =	
  @{

	
  	
  @“product”:	
  @“pwnies”,

	
  	
  @“location”:	
  @“US-­‐west”,

	
  	
  @“login”:	
  @“Facebook”,

};

[PFAnalytics	
  trackEvent:@“purchase”

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  dimensions:dimensions];	
  
	
  	
  
Automatic Tracking
Parse Analytics
Automatic Tracking
Parse Analytics
Let’s Build
parse.com/tutorials

parse.com/apps/quickstart
github.com/ParsePlatform/
P
Backup
Access Control
Parse Social
//	
  Automatically	
  own	
  all	
  objects	
  you	
  create	
  but

//	
  allow	
  everyone	
  to	
  read	
  them.

PFACL	
  *acl	
  =	
  [PFACL	
  ACL];

[acl	
  setPublicReadAccess:YES];	
  
[PFACL	
  setDefaultACL:acl

	
  withAccessForCurrentUser:YES]
Logging In
Parse Social
PFUser	
  *user	
  =

	
  	
  [PFUser	
  logInWithUsername:@“inlined”

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  password:@“YC	
  H4cks”];	
  


//	
  From	
  now	
  on:

PFUser	
  *user	
  =	
  [PFUser	
  currentUser];
Storing Data
Parse Data
Can also use like a class:



@interface	
  Armor	
  :	
  PFObject<PFSubclassing>

//	
  Properties	
  are	
  synthesized	
  with	
  @dynamic

@property	
  (nonatomic)	
  NSString	
  *name;

@property	
  (nonatomic)	
  int	
  price;

@end

Parse: 5 tricks that won YC Hacks