2013-11-24 12 views
0

我有一個從Core Data中執行的提取結果返回的NSManagedObject類型的對象的NSArray。 NSArray包含對象,因爲我可以在查詢之後通過將NSArray的內容打印到控制檯來驗證它。然而,我的問題是,我無法使用從查詢中檢索到的實體類型的對象對此數組進行快速枚舉。我在運行時得到確切的錯誤是:從iOS Core Data中的實體NSArray快速枚舉時得到運行時錯誤

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[My_Entity_Name countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0xa9f0090' 

我的for循環,我使用甚至沒有得到運行,因爲它打破了在for循環條件:

for (MyEntityType *entityType in self.entityArray) { 
... 
} 

的實際取命令我使用填充陣列self.entityArray是:

self.entityArray = [[Singleton sharedInstance] retrieveEntities:self.mainEntity.relationshipEntity.relationshipEntityId]; 

反過來,這是我retrieveEntity方法看起來像:

- (NSArray *)retrieveEntities:(NSNumber *)relationshipEntityAttributeId { 

    NSManagedObjectContext *context = [[DataEngine sharedInstance] managedObjectContext]; 
    NSError *error; 

    // Create fetch request 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:ENTITY_NAME inManagedObjectContext:context]; 
    [fetchRequest setEntity:entity]; 

    // Create predicate 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"relationshipEntity.relationshipAttributeId == %@", relationshipEntityAttributeId]; 
    [fetchRequest setPredicate:pred]; 

    NSArray *items = [context executeFetchRequest:fetchRequest error:&error]; 
    if ([items count]>0) { 
     return items[0]; 
    } else { 
     return nil; 
    } 
} 

任何人都可以看到爲什麼我得到上述錯誤?

在此先感謝所有回覆的人。

+0

添加的代碼並沒有真正的幫助,因爲它使用了方法'retrieveEntity',這對我們來說是未知的(至少對我而言)。 –

+0

我已更新代碼以包含其他方法。 – syedfa

回答

0

它說錯誤信息中的錯誤。

您有一個類My_Entity_Name。將My_Entity_Name的實例分配給屬性self.entityArray。當您執行for (MyEntityType *entityType in self.entityArray)時,它會將-countByEnumeratingWithState:objects:count:消息傳遞給該實例,並且會得到無法識別的選擇器錯誤。

我會查找分配值的位置(self.entityArray = …[self setEntityArray:…]),以確定self.entityArray如何獲取錯誤值。也許你應該發佈你如何進行抓取,或者如果有其他方法可以爲其分配一個值。


UPDATE

我不知道什麼-[Singleton retrieveEntity:]一樣。這不是一個類,它是標準框架的一部分,我不知道任何使用這種通用命名的第三方庫。

我可以告訴你的是,基於方法名稱-retrieveEntity:,它看起來像它返回單個對象而不是對象數組。通常返回數組的方法是多元化的,所以我期望這個名字更像-retrieveEntities:

你有個例外,因爲self.entityArray不包含NSArray。方法名稱看起來不像它會返回一個數組。

您是否確定[[Singleton sharedInstance] retrieveEntity:…]應返回NSArray?也許你應該發佈代碼-retrieveEntity:


UPDATE

不必返回數組。

NSArray *items = [context executeFetchRequest:fetchRequest error:&error]; 
if ([items count]>0) { 
    return items[0]; 
} else { 
    return nil; 
} 

如果items數組有任何元素,則返回第一個元素。這是items[0]所做的。

如果你想要回陣列將其更改爲:與return items;

NSArray *items = [context executeFetchRequest:fetchRequest error:&error]; 
if ([items count]>0) { 
    return items; 
} else { 
    return nil; 
} 

通知我把它換成return items[0];(返回數組的第一個元素)(返回整個數組)。

+0

感謝您的回答。我已經添加了代碼,顯示瞭如何從提取中填充數組。 – syedfa

+0

[Singleton retrieveEntity]是我的Singleton實例,它調用我的方法從Core Data中檢索結果。我已經改變了名稱,因爲它的功能更精確(即將其作爲複數形式,因爲它應該返回多個結果,我還包含了實際獲取的方法。) – syedfa

+0

我是否會收到此錯誤如果我的數組只包含一個對象?我問這是因爲如果我做了一個NSLog:(@「數組中的對象數:%d」,[self.entityArray count]);我注意到我得到了相同的這條線的錯誤也是。 – syedfa

0

代碼中存在拼寫錯誤,您填充self.entityAray,從self.entityArray中繪製。要麼這是您的示例中的一個小錯字,要麼說明您的錯誤。當查找self.entityArray時,找不到它,因爲拼寫錯誤en引發NSInalidArgumentException

+0

感謝您指出,發佈問題時,這是我的錯誤。 – syedfa