SlideShare a Scribd company logo
1 of 52
Download to read offline
初めての Parse
                株式会社 ミクシィ
                 田村 航弥




12年7月23日月曜日
agenda

              • @tamotamago
              • what’s Parse?
              • Data Store
              • Query
              • Push Notification


12年7月23日月曜日
@tamotamago について




12年7月23日月曜日
@tamotamago について
              • 田村 航弥
               • 東京 2 年目 iOS App developer
               • mixi for iPhone, iPad 開発
               • http://alpha.mixi.co.jp/2012/10974/
               • tamotamago.com




12年7月23日月曜日
@tamotamago について

              • 第2回 iphone_dev_jp 東京iPhone/Mac勉強会


                                  @k_kinukawa


                     mixi の iOS アプリ開発
                http://alpha.mixi.co.jp/2012/11000/

12年7月23日月曜日
What’s Parse?



12年7月23日月曜日
What’s Parse



              • Parse は BaaS (Backend as a Service)




12年7月23日月曜日
What’s Parse
              • Parse の機能

               • ユーザ認証機能

               • データストア、検索

               • remote notification
               • twitter, facebok SDK をラップ

               • and so on ...
12年7月23日月曜日
12年7月23日月曜日
Parse の導入


              • Parse Quick Start
              • tamotamago.com [Objective-C][Parse]初めての
                Parse ー導入編ー




12年7月23日月曜日
Data Store
              https://parse.com/docs/ios/api/Classes/PFObject.html




12年7月23日月曜日
Data Store


              • Key Value Store
              • ブラウザからデータ閲覧、編集が可能

              • リレーションも持たせることができる



12年7月23日月曜日
Data Store




12年7月23日月曜日
Data Store

   テーブル名みたいなもの      かってにつくられる




              自分でつくっていく

12年7月23日月曜日
Save -blocks-
    PFObject *object = [[PFObject alloc]initWithClassName:@"TestClass"];
    [object setObject:@"tamotamago" forKey:@"name"];
    [object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        NSString *result = succeeded ? @"success" : @"error";
        NSLog(@"result : %@", result);
    }];




12年7月23日月曜日
Save -callbacks-
   - (void)viewDidLoad
   {
       [super viewDidLoad];
   ! // Do any additional setup after loading the view, typically from a nib.
       PFObject *object = [[PFObject alloc]initWithClassName:@"TestClass"];
       [object setObject:@"tamotamago2" forKey:@"name"];
       [object saveInBackgroundWithTarget:self selector:@selector(saveCallback:error:)];
   }

   -(void)saveCallback:(NSNumber*)result error:(NSError*)error
   {
       if(!error){
           NSLog(@"%@", result);
       }else{
           NSLog(@"%@", error);
       }
   }




12年7月23日月曜日
Update
    PFObject *object = [[PFObject alloc]initWithClassName:@"TestClass"];
    [object setObject:@"tamotamago3" forKey:@"name"];
    [object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        [object setObject:@"tamotamago4" forKey:@"name"];
        [object save];
    }];




                        PFObject が 1 タプル




12年7月23日月曜日
Array Data
 PFObject *object = [[PFObject alloc]initWithClassName:@"TestClass"];
 NSArray *names = [NSArray arrayWithObjects:@"tamotamago5", @"tamotamago6", nil];
 [object addUniqueObjectsFromArray:names forKey:@"names"];
 [object save];




12年7月23日月曜日
Relation -one-to-many-

                          Post


                parent


               Comment   Comment   Comment




12年7月23日月曜日
Relation -one-to-many-
    PFObject *myPost = [PFObject objectWithClassName:@"Post"];
    [myPost setObject:@"I'm Hungry" forKey:@"title"];
    [myPost setObject:@"Where should we go for lunch?" forKey:@"content"];

    // Create the comment
    PFObject *myComment = [PFObject objectWithClassName:@"Comment"];
    [myComment setObject:@"Let's do Sushirrito." forKey:@"content"];

    // Add a relation between the Post and Comment
    [myComment setObject:myPost forKey:@"parent"];

    // This will save both myPost and myComment
    [myComment saveInBackground];




12年7月23日月曜日
Relation -one-to-many-
    PFObject *myPost = [PFObject objectWithClassName:@"Post"];
    [myPost setObject:@"I'm Hungry" forKey:@"title"];
    [myPost setObject:@"Where should we go for lunch?" forKey:@"content"];

    // Create the comment
    PFObject *myComment = [PFObject objectWithClassName:@"Comment"];
    [myComment setObject:@"Let's do Sushirrito." forKey:@"content"];

    // Add a relation between the Post and Comment
    [myComment setObject:myPost forKey:@"parent"];

    // This will save both myPost and myComment
    [myComment saveInBackground];




12年7月23日月曜日
Relation -many-to-many-

                 Post   Post   Post


          like


                 user   user   user




12年7月23日月曜日
Relation -many-to-many-
  Parse blog : A More Scalable Many-to-Many Approach

   PFObject *post2 = [PFObject objectWithClassName:@"Post"];
   [post2 setObject:@"I'm Hungry" forKey:@"title"];
   [post2 setObject:@"Where should we go for dinner?" forKey:@"content"];
   PFRelation *relation = [post2 relationforKey:@"likes"];

   for (PFObject *object in objects){
       [relation addObject: object];
   }

   [post2 save];




12年7月23日月曜日
Relation -many-to-many-
  Parse blog : A More Scalable Many-to-Many Approach

   PFObject *post2 = [PFObject objectWithClassName:@"Post"];
   [post2 setObject:@"I'm Hungry" forKey:@"title"];
   [post2 setObject:@"Where should we go for dinner?" forKey:@"content"];
   PFRelation *relation = [post2 relationforKey:@"likes"];

   for (PFObject *object in objects){
       [relation addObject: object];
   }

   [post2 save];




12年7月23日月曜日
Relation -many-to-many-
  Parse blog : A More Scalable Many-to-Many Approach

   PFObject *post2 = [PFObject objectWithClassName:@"Post"];
   [post2 setObject:@"I'm Hungry" forKey:@"title"];
   [post2 setObject:@"Where should we go for dinner?" forKey:@"content"];
   PFRelation *relation = [post2 relationforKey:@"likes"];

   for (PFObject *object in objects){
       [relation addObject: object];
   }

   [post2 save];




12年7月23日月曜日
Queries
              https://parse.com/docs/ios/api/Classes/PFQuery.html




12年7月23日月曜日
Basic Query




12年7月23日月曜日
Basic Query
  PFQuery *query = [PFQuery queryWithClassName:@"TestClass"];
  [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
      if (!error) {
          // The find succeeded.
          for (PFObject *object in objects){
               NSLog(@"object name -> %@", [object objectForKey:@"name"]);
          }
      } else {
          // Log details of the failure
          NSLog(@"Error: %@ %@", error, [error userInfo]);
      }
  }];




 2012-07-20   13:14:29.786   ParseTest[948:f803]   object   name   ->   tamotamago
 2012-07-20   13:14:29.787   ParseTest[948:f803]   object   name   ->   tamotamago2
 2012-07-20   13:14:29.787   ParseTest[948:f803]   object   name   ->   tamotamago4
 2012-07-20   13:14:29.788   ParseTest[948:f803]   object   name   ->   (null)
 2012-07-20   13:14:29.788   ParseTest[948:f803]   object   name   ->   tamotamago7




12年7月23日月曜日
Basic Query
  PFQuery *query = [PFQuery queryWithClassName:@"TestClass"];
  [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
      if (!error) {
          // The find succeeded.
          for (PFObject *object in objects){
               NSLog(@"object name -> %@", [object objectForKey:@"name"]);
          }
      } else {
          // Log details of the failure
          NSLog(@"Error: %@ %@", error, [error userInfo]);
      }
  }];




 2012-07-20   13:14:29.786   ParseTest[948:f803]   object   name   ->   tamotamago
 2012-07-20   13:14:29.787   ParseTest[948:f803]   object   name   ->   tamotamago2
 2012-07-20   13:14:29.787   ParseTest[948:f803]   object   name   ->   tamotamago4
 2012-07-20   13:14:29.788   ParseTest[948:f803]   object   name   ->   (null)
 2012-07-20   13:14:29.788   ParseTest[948:f803]   object   name   ->   tamotamago7




12年7月23日月曜日
Where 句



              [query whereKey:@"name" equalTo:@"tamotamago"];




12年7月23日月曜日
OrderBy


              [query orderByAscending:@"name"];




12年7月23日月曜日
IN 句

              NSArray *array = [NSArray arrayWithObjects:
                                @"tamotamago",
                                @"tamotamago2",
                                nil];
              [query whereKey:@"name" containedIn:array];




12年7月23日月曜日
Relation query




12年7月23日月曜日
Relation query

   PFQuery *query = [[PFQuery alloc] initWithClassName:@"Post"];
   [query findObjectsInBackgroundWithBlock:^(NSArray *posts, NSError *error) {
       for (PFObject *post in posts){
           PFRelation *relation = [post relationforKey:@"likes"];
           PFQuery *relationQuery = [relation query];
           [relationQuery findObjectsInBackgroundWithBlock:^(NSArray *tamotamagos, NSError *error) {
               for(PFObject *object in tamotamagos){
                   NSLog(@"%@", [object objectForKey:@"name"]);
               }
           }];

         }
   }];




12年7月23日月曜日
Paging




                                           query.skip = 3;
 [query findObjects];
                                           [query findObjects];

    object    name   ->   tamotamago
    object    name   ->   tamotamago2
                                            object name -> (null)
    object    name   ->   tamotamago4
                                            object name -> tamotamago7
    object    name   ->   (null)
    object    name   ->   tamotamago7


12年7月23日月曜日
Push Notification
              https://parse.com/docs/ios/api/Classes/PFPush.html




12年7月23日月曜日
Setup


   https://www.parse.com/tutorials/ios-push-notifications

                    証明書の発行とか




12年7月23日月曜日
Setup




12年7月23日月曜日
Setup
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
    (NSDictionary *)launchOptions
    {
        // Override point for customization after application launch.
        [Parse setApplicationId:@"app id"
                      clientKey:@"client key"];

        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|
         UIRemoteNotificationTypeAlert|
         UIRemoteNotificationTypeSound];

        return YES;
    }

    - (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
    {
        // Tell Parse about the device token.
        [PFPush storeDeviceToken:newDeviceToken];
        // Subscribe to the global broadcast channel.
        [PFPush subscribeToChannelInBackground:@""];
    }




12年7月23日月曜日
12年7月23日月曜日
channel



              Push を投げるゾーン




12年7月23日月曜日
channel

    - (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
    {
        // Tell Parse about the device token.
        [PFPush storeDeviceToken:newDeviceToken];
        // Subscribe to the global broadcast channel.
        [PFPush subscribeToChannelInBackground:@""];
        [PFPush subscribeToChannelInBackground:@"tamotamago"];
    }




12年7月23日月曜日
channel




                      tamotamago




               Broadcast
12年7月23日月曜日
channel




12年7月23日月曜日
channel


                  tamotamago3




              tamotamago2           tamotamago

                            Broadcast
12年7月23日月曜日
send notification

   PFPush *push = [[PFPush alloc] init];
   NSArray *channels = [NSArray arrayWithObjects:@"tamotamago", nil];
   [push setChannels:channels];
   [push setMessage:@"push test"];
   [push sendPushInBackgroundWithBlock:^(BOOL succeeded, NSError *error)
   {

   }];




12年7月23日月曜日
channel


       push!!
                    tamotamago3




                tamotamago2           tamotamago

                              Broadcast
12年7月23日月曜日
おわりに



12年7月23日月曜日
Others
              • Users
                • https://parse.com/docs/ios/api/Classes/PFUser.html

              • Geo Points
                • https://parse.com/docs/ios/api/Classes/PFGeoPoint.html

              • Facebook Users
                • https://parse.com/docs/ios/api/Classes/PFFacebookUtils.html

              • and so on ...

12年7月23日月曜日
でもお高いんでしょう?




12年7月23日月曜日
12年7月23日月曜日
enjoy



12年7月23日月曜日

More Related Content

What's hot

Jetpack datastore入門
Jetpack datastore入門Jetpack datastore入門
Jetpack datastore入門furusin
 
MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略ippei_suzuki
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかHisashi Aruji
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発Shinzo SAITO
 
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEtsuji Nakai
 
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoTsuyoshi Yamamoto
 
JavaScriptの落とし穴
JavaScriptの落とし穴JavaScriptの落とし穴
JavaScriptの落とし穴ikdysfm
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo dbYuji Isobe
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構katanyan
 
XHR2 Wonder Land
XHR2 Wonder LandXHR2 Wonder Land
XHR2 Wonder Landykhs
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりYuta Ohashi
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明furusin
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-uedayou
 

What's hot (20)

Jetpack datastore入門
Jetpack datastore入門Jetpack datastore入門
Jetpack datastore入門
 
Javaでmongo db
Javaでmongo dbJavaでmongo db
Javaでmongo db
 
MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略MongoDB: システム可用性を拡張するインデクス戦略
MongoDB: システム可用性を拡張するインデクス戦略
 
Jetpack Workshop
Jetpack WorkshopJetpack Workshop
Jetpack Workshop
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 
Try Jetpack
Try JetpackTry Jetpack
Try Jetpack
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
 
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
 
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
 
JavaScriptの落とし穴
JavaScriptの落とし穴JavaScriptの落とし穴
JavaScriptの落とし穴
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo db
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
Teclab3
Teclab3Teclab3
Teclab3
 
WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構
 
XHR2 Wonder Land
XHR2 Wonder LandXHR2 Wonder Land
XHR2 Wonder Land
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
 

Viewers also liked

Generic Parse Server
Generic Parse ServerGeneric Parse Server
Generic Parse Serverdavidolesch
 
Inside Logic Apps
Inside Logic AppsInside Logic Apps
Inside Logic AppsBizTalk360
 
Serverless Architecture - Azure Logic apps
Serverless Architecture - Azure Logic appsServerless Architecture - Azure Logic apps
Serverless Architecture - Azure Logic appsPuneet Ghanshani
 
Tomasz Janczuk - Webtaskalifragilistexpialidocious
Tomasz Janczuk - WebtaskalifragilistexpialidociousTomasz Janczuk - Webtaskalifragilistexpialidocious
Tomasz Janczuk - WebtaskalifragilistexpialidociousServerlessConf
 
Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture AppDynamics
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.jsVikash Singh
 
Serverless Azure
Serverless AzureServerless Azure
Serverless AzureMark Allan
 
Joe Emison - 10X Product Development
Joe Emison - 10X Product DevelopmentJoe Emison - 10X Product Development
Joe Emison - 10X Product DevelopmentServerlessConf
 

Viewers also liked (10)

Generic Parse Server
Generic Parse ServerGeneric Parse Server
Generic Parse Server
 
Parse Server Open Source
Parse Server Open SourceParse Server Open Source
Parse Server Open Source
 
Introduction Node.js
Introduction Node.jsIntroduction Node.js
Introduction Node.js
 
Inside Logic Apps
Inside Logic AppsInside Logic Apps
Inside Logic Apps
 
Serverless Architecture - Azure Logic apps
Serverless Architecture - Azure Logic appsServerless Architecture - Azure Logic apps
Serverless Architecture - Azure Logic apps
 
Tomasz Janczuk - Webtaskalifragilistexpialidocious
Tomasz Janczuk - WebtaskalifragilistexpialidociousTomasz Janczuk - Webtaskalifragilistexpialidocious
Tomasz Janczuk - Webtaskalifragilistexpialidocious
 
Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
Serverless Azure
Serverless AzureServerless Azure
Serverless Azure
 
Joe Emison - 10X Product Development
Joe Emison - 10X Product DevelopmentJoe Emison - 10X Product Development
Joe Emison - 10X Product Development
 

Similar to Parse introduction

大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発についてYuki Tanaka
 
WordPressで提供するWeb API
WordPressで提供するWeb APIWordPressで提供するWeb API
WordPressで提供するWeb APIYuko Toriyama
 
iPhone, iPad アプリ開発勉強会#3
iPhone, iPad アプリ開発勉強会#3iPhone, iPad アプリ開発勉強会#3
iPhone, iPad アプリ開発勉強会#3Hiroe Orz
 
Implement curry
Implement curryImplement curry
Implement curryGo Tanaka
 
Xmlシリアライズ
XmlシリアライズXmlシリアライズ
XmlシリアライズHidari Ikw
 
Movable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech TalkMovable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech TalkYuji Takayama
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azureKeiji Kamebuchi
 
5分でわかったつもりになるParse.com
5分でわかったつもりになるParse.com5分でわかったつもりになるParse.com
5分でわかったつもりになるParse.comKenta Tsuji
 
Jenkins plugin memo
Jenkins plugin memoJenkins plugin memo
Jenkins plugin memoKiyotaka Oku
 
物理エンジンを使って 3Dに息を吹き込む
物理エンジンを使って 3Dに息を吹き込む物理エンジンを使って 3Dに息を吹き込む
物理エンジンを使って 3Dに息を吹き込むKazuya Hiruma
 

Similar to Parse introduction (12)

Spockの基礎
Spockの基礎Spockの基礎
Spockの基礎
 
大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発について
 
WordPressで提供するWeb API
WordPressで提供するWeb APIWordPressで提供するWeb API
WordPressで提供するWeb API
 
iPhone, iPad アプリ開発勉強会#3
iPhone, iPad アプリ開発勉強会#3iPhone, iPad アプリ開発勉強会#3
iPhone, iPad アプリ開発勉強会#3
 
Implement curry
Implement curryImplement curry
Implement curry
 
Xmlシリアライズ
XmlシリアライズXmlシリアライズ
Xmlシリアライズ
 
Movable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech TalkMovable Type 6 Overview - New York Perl Mongers Tech Talk
Movable Type 6 Overview - New York Perl Mongers Tech Talk
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azure
 
5分でわかったつもりになるParse.com
5分でわかったつもりになるParse.com5分でわかったつもりになるParse.com
5分でわかったつもりになるParse.com
 
Jenkins plugin memo
Jenkins plugin memoJenkins plugin memo
Jenkins plugin memo
 
実践Realm
実践Realm実践Realm
実践Realm
 
物理エンジンを使って 3Dに息を吹き込む
物理エンジンを使って 3Dに息を吹き込む物理エンジンを使って 3Dに息を吹き込む
物理エンジンを使って 3Dに息を吹き込む
 

Recently uploaded

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 

Recently uploaded (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 

Parse introduction

  • 1. 初めての Parse 株式会社 ミクシィ 田村 航弥 12年7月23日月曜日
  • 2. agenda • @tamotamago • what’s Parse? • Data Store • Query • Push Notification 12年7月23日月曜日
  • 4. @tamotamago について • 田村 航弥 • 東京 2 年目 iOS App developer • mixi for iPhone, iPad 開発 • http://alpha.mixi.co.jp/2012/10974/ • tamotamago.com 12年7月23日月曜日
  • 5. @tamotamago について • 第2回 iphone_dev_jp 東京iPhone/Mac勉強会 @k_kinukawa mixi の iOS アプリ開発 http://alpha.mixi.co.jp/2012/11000/ 12年7月23日月曜日
  • 7. What’s Parse • Parse は BaaS (Backend as a Service) 12年7月23日月曜日
  • 8. What’s Parse • Parse の機能 • ユーザ認証機能 • データストア、検索 • remote notification • twitter, facebok SDK をラップ • and so on ... 12年7月23日月曜日
  • 10. Parse の導入 • Parse Quick Start • tamotamago.com [Objective-C][Parse]初めての Parse ー導入編ー 12年7月23日月曜日
  • 11. Data Store https://parse.com/docs/ios/api/Classes/PFObject.html 12年7月23日月曜日
  • 12. Data Store • Key Value Store • ブラウザからデータ閲覧、編集が可能 • リレーションも持たせることができる 12年7月23日月曜日
  • 14. Data Store テーブル名みたいなもの かってにつくられる 自分でつくっていく 12年7月23日月曜日
  • 15. Save -blocks- PFObject *object = [[PFObject alloc]initWithClassName:@"TestClass"]; [object setObject:@"tamotamago" forKey:@"name"]; [object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { NSString *result = succeeded ? @"success" : @"error"; NSLog(@"result : %@", result); }]; 12年7月23日月曜日
  • 16. Save -callbacks- - (void)viewDidLoad { [super viewDidLoad]; ! // Do any additional setup after loading the view, typically from a nib. PFObject *object = [[PFObject alloc]initWithClassName:@"TestClass"]; [object setObject:@"tamotamago2" forKey:@"name"]; [object saveInBackgroundWithTarget:self selector:@selector(saveCallback:error:)]; } -(void)saveCallback:(NSNumber*)result error:(NSError*)error { if(!error){ NSLog(@"%@", result); }else{ NSLog(@"%@", error); } } 12年7月23日月曜日
  • 17. Update PFObject *object = [[PFObject alloc]initWithClassName:@"TestClass"]; [object setObject:@"tamotamago3" forKey:@"name"]; [object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { [object setObject:@"tamotamago4" forKey:@"name"]; [object save]; }]; PFObject が 1 タプル 12年7月23日月曜日
  • 18. Array Data PFObject *object = [[PFObject alloc]initWithClassName:@"TestClass"]; NSArray *names = [NSArray arrayWithObjects:@"tamotamago5", @"tamotamago6", nil]; [object addUniqueObjectsFromArray:names forKey:@"names"]; [object save]; 12年7月23日月曜日
  • 19. Relation -one-to-many- Post parent Comment Comment Comment 12年7月23日月曜日
  • 20. Relation -one-to-many- PFObject *myPost = [PFObject objectWithClassName:@"Post"]; [myPost setObject:@"I'm Hungry" forKey:@"title"]; [myPost setObject:@"Where should we go for lunch?" forKey:@"content"]; // Create the comment PFObject *myComment = [PFObject objectWithClassName:@"Comment"]; [myComment setObject:@"Let's do Sushirrito." forKey:@"content"]; // Add a relation between the Post and Comment [myComment setObject:myPost forKey:@"parent"]; // This will save both myPost and myComment [myComment saveInBackground]; 12年7月23日月曜日
  • 21. Relation -one-to-many- PFObject *myPost = [PFObject objectWithClassName:@"Post"]; [myPost setObject:@"I'm Hungry" forKey:@"title"]; [myPost setObject:@"Where should we go for lunch?" forKey:@"content"]; // Create the comment PFObject *myComment = [PFObject objectWithClassName:@"Comment"]; [myComment setObject:@"Let's do Sushirrito." forKey:@"content"]; // Add a relation between the Post and Comment [myComment setObject:myPost forKey:@"parent"]; // This will save both myPost and myComment [myComment saveInBackground]; 12年7月23日月曜日
  • 22. Relation -many-to-many- Post Post Post like user user user 12年7月23日月曜日
  • 23. Relation -many-to-many- Parse blog : A More Scalable Many-to-Many Approach PFObject *post2 = [PFObject objectWithClassName:@"Post"]; [post2 setObject:@"I'm Hungry" forKey:@"title"]; [post2 setObject:@"Where should we go for dinner?" forKey:@"content"]; PFRelation *relation = [post2 relationforKey:@"likes"]; for (PFObject *object in objects){ [relation addObject: object]; } [post2 save]; 12年7月23日月曜日
  • 24. Relation -many-to-many- Parse blog : A More Scalable Many-to-Many Approach PFObject *post2 = [PFObject objectWithClassName:@"Post"]; [post2 setObject:@"I'm Hungry" forKey:@"title"]; [post2 setObject:@"Where should we go for dinner?" forKey:@"content"]; PFRelation *relation = [post2 relationforKey:@"likes"]; for (PFObject *object in objects){ [relation addObject: object]; } [post2 save]; 12年7月23日月曜日
  • 25. Relation -many-to-many- Parse blog : A More Scalable Many-to-Many Approach PFObject *post2 = [PFObject objectWithClassName:@"Post"]; [post2 setObject:@"I'm Hungry" forKey:@"title"]; [post2 setObject:@"Where should we go for dinner?" forKey:@"content"]; PFRelation *relation = [post2 relationforKey:@"likes"]; for (PFObject *object in objects){ [relation addObject: object]; } [post2 save]; 12年7月23日月曜日
  • 26. Queries https://parse.com/docs/ios/api/Classes/PFQuery.html 12年7月23日月曜日
  • 28. Basic Query PFQuery *query = [PFQuery queryWithClassName:@"TestClass"]; [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if (!error) { // The find succeeded. for (PFObject *object in objects){ NSLog(@"object name -> %@", [object objectForKey:@"name"]); } } else { // Log details of the failure NSLog(@"Error: %@ %@", error, [error userInfo]); } }]; 2012-07-20 13:14:29.786 ParseTest[948:f803] object name -> tamotamago 2012-07-20 13:14:29.787 ParseTest[948:f803] object name -> tamotamago2 2012-07-20 13:14:29.787 ParseTest[948:f803] object name -> tamotamago4 2012-07-20 13:14:29.788 ParseTest[948:f803] object name -> (null) 2012-07-20 13:14:29.788 ParseTest[948:f803] object name -> tamotamago7 12年7月23日月曜日
  • 29. Basic Query PFQuery *query = [PFQuery queryWithClassName:@"TestClass"]; [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if (!error) { // The find succeeded. for (PFObject *object in objects){ NSLog(@"object name -> %@", [object objectForKey:@"name"]); } } else { // Log details of the failure NSLog(@"Error: %@ %@", error, [error userInfo]); } }]; 2012-07-20 13:14:29.786 ParseTest[948:f803] object name -> tamotamago 2012-07-20 13:14:29.787 ParseTest[948:f803] object name -> tamotamago2 2012-07-20 13:14:29.787 ParseTest[948:f803] object name -> tamotamago4 2012-07-20 13:14:29.788 ParseTest[948:f803] object name -> (null) 2012-07-20 13:14:29.788 ParseTest[948:f803] object name -> tamotamago7 12年7月23日月曜日
  • 30. Where 句 [query whereKey:@"name" equalTo:@"tamotamago"]; 12年7月23日月曜日
  • 31. OrderBy [query orderByAscending:@"name"]; 12年7月23日月曜日
  • 32. IN 句 NSArray *array = [NSArray arrayWithObjects: @"tamotamago", @"tamotamago2", nil]; [query whereKey:@"name" containedIn:array]; 12年7月23日月曜日
  • 34. Relation query PFQuery *query = [[PFQuery alloc] initWithClassName:@"Post"]; [query findObjectsInBackgroundWithBlock:^(NSArray *posts, NSError *error) { for (PFObject *post in posts){ PFRelation *relation = [post relationforKey:@"likes"]; PFQuery *relationQuery = [relation query]; [relationQuery findObjectsInBackgroundWithBlock:^(NSArray *tamotamagos, NSError *error) { for(PFObject *object in tamotamagos){ NSLog(@"%@", [object objectForKey:@"name"]); } }]; } }]; 12年7月23日月曜日
  • 35. Paging query.skip = 3; [query findObjects]; [query findObjects]; object name -> tamotamago object name -> tamotamago2 object name -> (null) object name -> tamotamago4 object name -> tamotamago7 object name -> (null) object name -> tamotamago7 12年7月23日月曜日
  • 36. Push Notification https://parse.com/docs/ios/api/Classes/PFPush.html 12年7月23日月曜日
  • 37. Setup https://www.parse.com/tutorials/ios-push-notifications 証明書の発行とか 12年7月23日月曜日
  • 39. Setup - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { // Override point for customization after application launch. [Parse setApplicationId:@"app id" clientKey:@"client key"]; [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeAlert| UIRemoteNotificationTypeSound]; return YES; } - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken { // Tell Parse about the device token. [PFPush storeDeviceToken:newDeviceToken]; // Subscribe to the global broadcast channel. [PFPush subscribeToChannelInBackground:@""]; } 12年7月23日月曜日
  • 41. channel Push を投げるゾーン 12年7月23日月曜日
  • 42. channel - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken { // Tell Parse about the device token. [PFPush storeDeviceToken:newDeviceToken]; // Subscribe to the global broadcast channel. [PFPush subscribeToChannelInBackground:@""]; [PFPush subscribeToChannelInBackground:@"tamotamago"]; } 12年7月23日月曜日
  • 43. channel tamotamago Broadcast 12年7月23日月曜日
  • 45. channel tamotamago3 tamotamago2 tamotamago Broadcast 12年7月23日月曜日
  • 46. send notification PFPush *push = [[PFPush alloc] init]; NSArray *channels = [NSArray arrayWithObjects:@"tamotamago", nil]; [push setChannels:channels]; [push setMessage:@"push test"]; [push sendPushInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { }]; 12年7月23日月曜日
  • 47. channel push!! tamotamago3 tamotamago2 tamotamago Broadcast 12年7月23日月曜日
  • 49. Others • Users • https://parse.com/docs/ios/api/Classes/PFUser.html • Geo Points • https://parse.com/docs/ios/api/Classes/PFGeoPoint.html • Facebook Users • https://parse.com/docs/ios/api/Classes/PFFacebookUtils.html • and so on ... 12年7月23日月曜日