问题解析
按照CleanCloud官方文档对AVObject和AVUser子类化发现根本无法通过点语法将自定义属性存储网络
// 这种方法似乎是不可以
#import "AVObject.h"
@interface BGObject : AVObject <AVSubclassing>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSNumber *age;
@end
#import "BGObject.h"
@implementation BGObject
+ (NSString *)parseClassName
{
return @"BGTEST";
}
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[BGObject registerSubclass]; // 注册
[AVOSCloud setApplicationId:@"YWnNdqCop9CagqbDOAe1qTkW" clientKey:@"mJvVw4G48gdeIxuireJoz9zW"];
return YES;
}
数据并没有上传保存网络
探索
经过多方查询,我似乎找到了一些蛛丝马迹。
使用官方提供的最基本的方法,这种方法可以将数据存储与网络,但实体变量内对应属性内不会有值。
[self setObject:name forKey:@"name"];
[self setObject:age forKey:@"age"];
这种方法不会将数据保存到AVObject的子类,这种方法并没有直接或间接调用属性的setter方法,从网络获取到数据后,也不能使用点语法直接取到数据的值,因为我们并没有方法将数据存储到我们自定义的属性内。你可以获取到网络数据后去查看model的属性值,他们都是nil,数据并没有存储到对应属性,而且model内还会多出你新添加的属性,这些属性只可以通过objectForKey: 或字面量方法获取。
following me
最佳解决方法,重写自定义属性的setter方法
#import "BGObject.h"
@implementation BGObject
+ (NSString *)parseClassName
{
return @"BGTEST";
}
// 重写set方法
- (void)setName:(NSString *)name
{
_name = name;
[self setObject:name forKey:@"name"];
}
- (void)setAge:(NSNumber *)age
{
_age = age;
[self setObject:age forKey:@"age"];
}
@end
此时掉用点语法时也会执行setObject:forKey方法,执行save方法时,数据既可以保存本地Objec又可以保存云端,在使用云端获取到的数据进行直接赋值时,setValue: forKey: 数据也会调用setter方法,同样可以将数据保存到AVObject的子类对象。
此时就已经完美解决,AVObject子类化数据存储问题了。AVUser是AVObject的特例解决方案基本相同。