Parseのデータは、PFObjectを使ってアクセスすることができますが、
PFObjectのサブクラスを作るとデータのフィールドを明示したりコード補完することができ、大変便利です。
サブクラスを定義しアプリで利用するためには、Subclassing PFObject の通りの手順を行わないといけないのですが、
クラス定義と登録が別なので、最後の手順で作成したサブクラスのヘッダーをインポートし、AppDelegate
でregisterSubclass
を呼ばないと行けないというのをよく忘れがちです。
original.m
// Armor.h
@interface Armor : PFObject<PFSubclassing>
+ (NSString *)parseClassName;
@end
// Armor.m
// Import this header to let Armor know that PFObject privately provides most
// of the methods for PFSubclassing.
# import <Parse/PFObject+Subclass.h>
@implementation Armor
+ (NSString *)parseClassName {
return @"Armor";
}
@end
// AppDelegate.m
# import <Parse/Parse.h>
# import "Armor.h" // これと
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[Armor registerSubclass]; // この箇所
[Parse setApplicationId:parseAppId clientKey:parseClientKey];
}
いちいちAppDelegate
で登録を行わなくても、サブクラスがロードされた時に登録すればいいと気づいたので、+(void)load
を使って登録を行うようにしました。
new.m
// Armor.h
@interface Armor : PFObject<PFSubclassing>
+ (NSString *)parseClassName;
@end
// Armor.m
// Import this header to let Armor know that PFObject privately provides most
// of the methods for PFSubclassing.
# import <Parse/PFObject+Subclass.h>
@implementation Armor
// クラスロード時に登録を行う
+ (void)load {
__weak typeof(self) weakSelf = self;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[weakSelf registerSubclass];
});
}
+ (NSString *)parseClassName {
return @"Armor";
}
@end
// AppDelegate.m
# import <Parse/Parse.h>
//#import "Armor.h" // これと
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// [Armor registerSubclass]; // これはいらない
[Parse setApplicationId:parseAppId clientKey:parseClientKey];
}
これで、サブクラス登録を忘れてデータにアクセスできずしばらくデバックするはめになるという悲しいことになりにくくなりました。
タイピングするのが面倒というのであれば、XcodeかDashのSnippetに登録するとよいでしょう