ニフクラ mobile backendを利用されている方向けのユーザコミュニティから役立ちそうな質問を取り上げます。今回はデータストアのサブクラスについてです。
iOSでの通常のデータ取得方法
通常NCMB Objectを直接操作することが多いかと思います。
NCMBQuery *query = [NCMBQuery queryWithClassName:@"Post"]; [query whereKey:@"author" equalTo:@"ncmb"]; [query findObjectsInBackgroundWithBlock:^(NSArray *posts, NSError *error) { for (NCMBObject *post in posts) { NSLog(@"%@", post); // objectForKeyアクセス NSString *author = [post objectForKey:@"author"]; BOOL publication = [[post objectForKey:@"publication"] boolValue]; NSLog(@"author:%@, publication:%@", author, publication ? @"YES" : @"NO"); // プロパティアクセス NSString *objectId = post.objectId; NSDate *updatedAt = post.updatedAt; NSDate *createdAt = post.createdAt; NSLog(@"objectId: %@, updatedAt: %@, createdAt: %@", objectId, updatedAt, createdAt); // 再取得 [post refresh]; } }];
サブクラスを作成する
データストアのクラスごとにサブクラスが作成できます。たとえば上記例で言うと、Post.m/Post.hというファイルを作成します。
# Post.h #import <NCMB/NCMB.h> @interface Post : NCMBObject<NCMBSubclassing> @property (strong) NSString *author; @property (strong) NSString *title; @property (strong) NSNumber *publication; @property (strong) NSNumber *comments; + (NSString *)ncmbClassName; - (BOOL)isPublished; @end
# Post.m #import "Post.h" #import <NCMB/NCMBObject+Subclass.h> @implementation Post @dynamic author; @dynamic title; @dynamic publication; @dynamic comments; + (NSString *)ncmbClassName { return @"Post"; } - (BOOL)isPublished { if ([self.publication isEqual:@YES]) { return true; } else { return false; } } @end
カラムとして設定したい名称をプロパティとして設定します。
このサブクラスを使った場合、データの検索が次のようにシンプルになります。
NCMBQuery *query = [Post query]; [query whereKey:@"comments" lessThanOrEqualTo:@10]; [query findObjectsInBackgroundWithBlock:^(NSArray *posts, NSError *error) { if (!error) { for (Post *post in posts) { NSLog(@"タイトル: %@, 公開: %@", post.title, [post isPublished] ? @"YES" : @"NO"); } } else { NSLog(@"検索に失敗: %@", error); } }];
なお注意点としては、
- [Post registerSubclass]; を NCMB setApplicationKey より前に行う必要があります。
- サブクラス名とncmbClassNameで返却する文字列が一致している必要があります。
サブクラスを使ったデータ保存
データ保存処理もシンプルになります。
Post *post = [Post object]; post.author = @"NCMB"; post.title = @"NIFTY Cloud mobile backend"; post.publication = @NO; post.comments = @5; [post save];
通常の場合、
NCMBObject *post = [NCMBObject objectWithClassName:@"Post"]; [post setObject:@"NCMB" forKey:@"author"]; [post setObject:@"NIFTY Cloud mobile backend" forKey:@"title"]; [post setObject:[NSNumber numberWithBool:NO] forKey:@"publication"]; [post setObject:[NSNumber numberWithInt:5] forKey:@"comments"]; [post save];
なので、setObjectを使わない分、よりシンプルに書けるようになります。
ぜひサブクラスを使って可読性高いコードにしてください。詳細はSDKガイド (iOS) : サブクラスにてどうぞ。