@dynamic属性需要设置器与多个行为

问题描述:

我有一个包含多个用户对象类,并因此具有它们的阵列作为一个实例变量:@dynamic属性需要设置器与多个行为

NSMutableArray *users; 

棘手的部分是设置它。我通过Objective Resource从服务器反序列化这些对象,而对于后端原因,用户只能作为UID的长字符串返回 - 我在本地使用的是用户键入UID的单独字典。鉴于串uidString逗号分离的UID我重写默认的setter和填充实际的用户对象:

@dynamic users; 
- (void)setUsers:(id)uidString { 
    users = [NSMutableArray arrayWithArray: 
       [[User allUsersDictionary] objectsForKeys:[(NSString*)uidString componentsSeparatedByString:@","]]]; 
} 

问题是这样的:我现在用SQLitePO,存储这些作为数组序列化这些数据库用户对象,而不是原始字符串。因此,当我从数据库中检索它时,setter错误地将这个用户对象数组视为一个字符串!当我从数据库和网络中获取这个对象时,我实际上想要调整setter的行为。

我不能让getter序列化回一个字符串,而不会撕毁引用这个用户对象数组的大代码,并且试图在setter中检测是否有字符串或数组进入:

if ([uidString respondsToSelector:@selector(addObject)]) { 
     // Already an array, so don't do anything - just assign users = uidString 

但没有成功......所以我有点卡住了 - 有什么建议吗?提前致谢!

你尝试的解决方案是不完全错,但应该是这样的:

if ([uidString respondsToSelector:@selector(addObject:)]) { 
    // Already an array, so don't do anything - just assign users = uidString 

看来你forggoten关于“:” - 在ADDOBJECT一个参数毕竟。

但是,做正确的方法是检查传递对象的类:

if ([uidString isKindOfClass[NSArray class]]) 

希望这是有帮助的,

欢呼声中,帕维尔

+0

感谢帕维尔 - 它现在使用你的第二个建议。如果([uidString class] == [NSString class])没有意识到“isKindOfClass”是正确的方式,我最初尝试过的第二个建议(以noob方式) – ambertch 2010-05-26 20:18:07

这将是混乱的要少得多 - 并更符合通常的可可风格 - 如果你让实际的设置者采取NSArrayNSMutableArray

- (void)setUsers:(NSArray*)usersArray { ... } 

...并有另一种方法,说-setUsersFromUidString:,服用NSString参数,对于第一种情况:

- (void)setUsersFromUidString:(NSString*)uidString { ... } 

你原来的做法失去了自我文档的Objective-C的优势已经并会混淆用户班上。

+0

感谢风格提示,我会牢记这一点! – ambertch 2010-05-26 20:18:38