我有一个包含多个用户对象的类,因此它们有一个数组作为实例变量:
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
但没有成功...所以我有点卡住 - 有什么建议吗?提前谢谢!
答案 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采用NSArray
或NSMutableArray
:
- (void)setUsers:(NSArray*)usersArray { ... }
...并为第一种情况采用另一种方法,比如-setUsersFromUidString:
,采用NSString
参数:
- (void)setUsersFromUidString:(NSString*)uidString { ... }
您的原始方法失去了自我文档的优势Objective-C已经并且会使该类用户感到困惑。