2014-07-17 1 views
1

:NSFetchedResultController 복잡한 종류의 케이스

[Agency] <--->> [AgencyRating] <<---> [RatingType] 

rating types의 번호 (예 : 전체, 브랜딩, 디자인, 프로그래밍, 등.)이있다. 각 agency에는 이러한 등급 유형이 모두 포함될 수 있습니다 (예 : agency FooBar는 디자인에서 1050 점, 브랜딩에서 700 점을 가짐).

테이블 구조 :

Agency 이름 : 문자열 RatingType 이름 : 문자열 AgencyRating : agency_ref : agency에 관계 ratingType_ref : rating type에 관계 값 : 정수.

분할보기 컨트롤러가 있습니다. 왼쪽에는 rating types이 포함되어 있습니다. 사용자가 어떤 등급 유형을 선택하면 오른쪽에 등급 평가 기관별로 정렬하여 표시하고 싶습니다.

NSFetchedResultController으로 달성하고 싶습니다. 평가 값을 셀에 표시하는 방법을 이해하지만 정렬 설명자를 만드는 방법을 이해하지 못합니다. 나는 종류의 이름으로,하지만 난 기반의 평가 값을 기준으로 정렬해야합니다

컨트롤러 :

_contentFetchController = [Agency MR_fetchAllGroupedBy:nil withPredicate:[NSPredicate predicateWithValue:YES] sortedBy:@"name" ascending:YES]; 

셀 :

- (void) configureForAgency:(Agency *) agency ratingType:(RatingType *) ratingType forIndexPath:(NSIndexPath *) path { 
    self.positionLabel.text = [NSString stringWithFormat: @"%d", (int)path.row + 1]; 

    UIImage *image = [UIImage imageWithContentsOfFile:agency.logoPath]; 
    if (image) { 
     self.logoImageView.image = image; 
    } 

    self.nameLabel.text = agency.name; 

    // HERE IS VALUE OF RATING 
    self.ratingValueLabel.text = [[agency ratingForRatingType:ratingType] stringValue]; 
} 

당신이 볼 수 있듯이 현재

내가 가진 선택한 등급 유형. 어떤 아이디어?

답변

2

이렇게하려면 Agencies을 가져와야하며 선택된 등급 유형의 AgencyRating이 연결되어 있고 모든 값을 등급 값별로 정렬해야합니다.

등급 유형이 이고 등급 값이 ratingValue이고 AgencyRating이라고 가정하면 agencyRatings입니다. 또한 각 대행사는 각 등급 유형에 대해 하나의 대행사 등급 만 가질 수 있다고 가정합니다 (그렇지 않은 경우 선택한 유형의 모든 대행사 등급 SUM으로 정렬해야 함).

접두어로 판단하면 접두어로 붙이기 전에 익숙하지 않은 MagicalRecord를 사용하고있는 것 같습니다. 단 NSFetchRequestNSFetchedResultsController으로 할 수 있습니다.

먼저 NSFetchRequest를 설정해야합니다 : 당신은 일반적으로 fetchRequest 방금 ​​만든 그것을 제공하는 것처럼

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Agency"]; 
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ANY agencyRatings.ratingType = %@", ratingType]; 
fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"agencyRatings.ratingValue" ascending:YES] ]; 

그런 다음 당신이 NSFetchedResultsController을 설정할 수 있습니다.

사용자가 변경 때마다 시간 ratingType 당신이 fetchRequestpredicate을 변경하고 fetchedResultsControllerperformFetch를 호출해야합니다.

당신의 경우에 맞게 약간 조정해야 할 필요가 있지만, 생각은 관련 테이블을 가리키는 술어와 정렬 설명자가 있어야한다는 것입니다.

+1

'sortDescriptorWithKey : @ "agencyRatings.ratingValue"생성 :'to-many 키는 허용되지 않습니다' – user2786037

+0

그래, 맞아, 잊어 버렸어. –

+0

내가 이해하는 한, 거기에만있다. 한 가지 해결책 : 배열과 함께 tableView를 데이터 소스로 사용하고 원시 SQL 쿼리로 해당 배열을 채 웁니다. 그러나 또 다른 해결책이 있기를 바랍니다 :) – user2786037