2010-05-26 50 views
0

我有一個包含多個用戶對象類,並因此具有它們的陣列作爲一個實例變量:@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 

但沒有成功......所以我有點卡住了 - 有什麼建議嗎?提前致謝!

回答

2

你嘗試的解決方案是不完全錯,但應該是這樣的:

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

1

這將是混亂的要少得多 - 並更符合通常的可可風格 - 如果你讓實際的設置者採取NSArrayNSMutableArray

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

...並有另一種方法,說-setUsersFromUidString:,服用NSString參數,對於第一種情況:

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

你原來的做法失去了自我文檔的Objective-C的優勢已經並會混淆用戶班上。

+0

感謝風格提示,我會牢記這一點! – ambertch 2010-05-26 20:18:38

相關問題