LeanCloud 的 AVObject 和 AVUser的子类化

问题解析

按照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的特例解决方案基本相同。

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值