2014-05-13 63 views
0

核心數據已經處理了我的關係,我是否需要構建一個新的查詢來使用NSFetchedResultsController?如何處理與NSFetchedResultsController的關係?

我有包含「照片」的「相冊」。

Album *anAlbum = [...getalbum...]; 
在* cellForItemAtIndexPath

:我想做點什麼:

anAlbum.photos 

但是,我不能indexPath轉換爲NSSet中成員索引。 (顯然)

沒有核心數據我通常只生成自己需要的查詢。我想利用核心數據(顯然,也是)。

+0

你想展示什麼?照片或相冊? –

+0

「照片」實體(anAlbum.photos是關係)包含資產網址。我對顯示沒有任何問題,我更關心如何使用NSFectchedResultsController的NSSet(核心數據關係) - 或直接使用視圖(collection/table)。 – chrisp

回答

0

「Photo」實體(anAlbum.photos是關係)包含 資產網址。我對顯示沒有任何問題,它更像是關於如何使用NSSet(核心數據關係)與 NSFectchedResultsController - 或直接與視圖 (集合/表格)關聯的 。

首先,我會用這個NSFetchedResultsController。該組件與表結合使用,並允許以延遲加載的方式加載數據。 其次,我將使用的提取請求應針對Photo實體運行,而不是針對Album運行。換句話說,您應該選擇屬於特定專輯的所有照片。

這裏的代碼,我會用...

- (NSFetchedResultsController *)fetchedResultsController { 

    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
     entityForName:@"Photo" inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"album == %@", anAlbum]; 
    [request setPredicate:predicate]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
     initWithKey:@"takeAt" ascending:NO]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = 
     [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
      managedObjectContext:managedObjectContext sectionNameKeyPath:nil 
      cacheName:nil]; 
    self.fetchedResultsController = theFetchedResultsController; 

    return _fetchedResultsController; 

} 

所以現在你tableView:cellForRowAtIndexPath:你可以使用

Photo *photo = [_fetchedResultsController objectAtIndexPath:indexPath]; 
// access the album the photo belongs to 
Album* album = photo.album; 

您可以在Core Data Tutorial for iOS: How To Use NSFetchedResultsController把握NSFetchedResultsController的主要概念。

0

通常,您將要將該集合轉換爲NSArray(可能包含NSSet的allobjects),並可能對其進行分類或使用NSSortDescriptor或NSPredicate或兩者進行過濾。然後,您可以使用索引路徑部分/行通過索引訪問數組。

如果這是您所需要的,您可以明顯使用NSMutableArray,但嘗試單獨訪問NSSet項目是一件痛苦的事情,因爲您基本上必須枚舉它們以找到您要查找的內容。只需創建一個數組。此處,我已經做了這樣一個例子:

NSArray *tableViewData = [NSArray arrayWithArray:[album.photos allObjects]]; 

然後你只需要訪問tableViewData使用對象:

UIImage *obj = UIImageJPEGRepresentation([tableViewData objectAtIndex:indexPath.row], 0.50f); 

類似的東西。

+0

我曾考慮過這個問題。我參加了CS193P演示,Paul Haggerty確實只是從頭開始構建NSFetchedResultsController--因爲他沒有使用數據模型中的「Photographer.photos」關係。這是拋棄我的東西。 – chrisp

+0

不確定我是否理解,但是如果您執行沒有謂詞的提取,您將獲得模型中的所有數據;所以,通常情況下,您將使用謂詞來過濾抓取。但是,謂詞可以過濾模型中的任何字段。主要的一點是,一旦你做了你的提取,你可以通過使用上面指出的方法訪問任何實體來獲取提取結果。對不起,我不熟悉CS193P。在實踐中,你通常會有一個「助手」類來構建抓取結果控制器並處理基本操作。在我的例子中,它會獲取目標的父項。 – RegularExpression

+0

我的意思是...你已經有了「album.photos」 - 爲什麼我需要爲同一個數據集建立一個新的查詢? – chrisp

相關問題