@dynamic属性需要具有多个行为的setter

时间:2010-05-26 06:11:40

标签: iphone objective-c

我有一个包含多个用户对象的类,因此它们有一个数组作为实例变量:

NSMutableArray *users;

棘手的部分是设置它。我通过Objective Resource从服务器反序列化这些对象,并且对于后端原因,用户只能作为一长串UID返回 - 我本地拥有的是一个单独的UID用户字典。给定逗号分隔UID的字符串 uidString ,我覆盖默认的setter并填充实际的用户对象:

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

您尝试的解决方案并非完全错误,但应该如下所示:

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

似乎你已经忘记了“:” - addObject毕竟需要一个参数。

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

if ([uidString isKindOfClass[NSArray class]])

希望这很有帮助,

干杯,帕维尔

答案 1 :(得分:1)

如果你让实际的setter采用NSArrayNSMutableArray

,那将更容易让人感到困惑 - 并且更符合通常的Cocoa风格
- (void)setUsers:(NSArray*)usersArray { ... }

...并为第一种情况采用另一种方法,比如-setUsersFromUidString:,采用NSString参数:

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

您的原始方法失去了自我文档的优势Objective-C已经并且会使该类用户感到困惑。