ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

コミュニティより:NCMBObjectのサブクラス化は同名で行う

ニフティクラウド 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) : サブクラスにてどうぞ。

NIFTYCloud-mbaas/UserCommunity

f:id:mbaasblog:20180927114437p:plain