2015-11-25 38 views
0

我已經編寫了一些代碼將數據從服務器映射到CoreData對象,並且這一切都按預期工作。但是,我在日誌中收到很多無法識別的選擇器警告。這基本上是由於服務器對不同對象類型具有相同的密鑰名稱。我的代碼如下:CoreData/NSManagedObject映射,如何檢查對象屬性是否支持傳遞類型

for (id key in dict) 
    { 
     if ([UsefulFunctions objectContainsData:dict[key]]) 
     { 
      if (mapping[key]) 
      { 
       SEL selector = NSSelectorFromString(mapping[key]); 

       if ([entity respondsToSelector:selector]) 
       { 
        @try { 
         // try and set the value, might not work if dict[key] is unexpected type 
         [entity setValue:dict[key] forKey:mapping[key]]; 
        } 
        @catch (NSException *exception) { 
         // deal with the exception 
        } 
       } 
      } 
     } 
    } 

基本上這個代碼所做的是循環通過服務器傳遞的對象的'字典'。它檢查它們包含的數據,然後創建基於所述映射字典我已經安裝(在下面的例子)選擇:

@"id" : @"nID", 

然後,它檢查該實體(NSManagedObject)響應所創建的選擇器(NID例如),然後嘗試應用數據來檢查它的有效性。就像上面提到的,這一切工作正常,但是,由於不匹配的類型,我在日誌中打印了很多煩人的錯誤。有沒有更好的方法來測試NSManagedObject是否可以處理傳遞給它的數據?

例如,nID包含一個數字,但如果服務器傳遞一個字符串,應用程序將崩潰。所以我用try/catch來包裝它,以阻止這種情況的發生。如果沒有嘗試/捕捉,有沒有辦法做到這一點,或者這是正確的做法?我不只是想壓制警告。

感謝您的任何幫助。

回答

1

這是NSAttributeDescription的目的,您可以通過NSEntityDescriptionpropertiesByName獲取該實體的用途。它會告訴你attributeType,你可以用它進行驗證/比較。另請參閱attributeValueClassName,您可以利用它。

+0

非常感謝您指點我正確的方向,將嘗試實施這種方法。 –

+0

是的,完美的工作,謝謝。 –

相關問題