2012-11-13 3 views
2

I는 다음과 같습니다 모델이 있습니다: N 관계를

enter image description here

코드에서, 나는이 A가 여러 조식을 가질 수 있지만, 그것은 C 당 하나의 B를 가지고 시행하고를 .

내가 원하는 것은 주어진 C를 B로 묶어서 나열하는 것입니다. 이제 C로 시작하여 모든 Bs 세트를 가져온 다음 모두의 집합은 각 B에 대해.

내가 뭘하고 싶은지 list NSFetchedResultsController를 사용합니다. 나는 "ANY bc MATCHES myC"를 사용하여 C로 그들을 걸러 낼 수 있지만 어떻게해야 볼 수 없는지는 올바른 B로 그룹화하는 것입니다.

즉, A에 많은 Bs가 있기 때문에 내 C에 속한 것이 무엇인지 알아 내고 NSFetchedResultsController에서 사용합니까? 그게 가능한가?

+0

'B 그룹으로 그룹화'라고 말하면 출력 배열을 정렬하는 것 이상의 의미를 갖게되어 지정된 B로 C에 연결된 As가 인접하게됩니다. – Tommy

+0

UITableView에서 그룹화하는 것을 의미하므로 연속되는 것 위에는 C.name이있는 섹션 헤더가 있습니다. 나는 당신이이 길로 향하고있는 곳을 본 것 같아 - 나는 그들의 b.c.name에 A의 배열을 정렬 할 수있다, 네? 그 생각을하지 않았다. 그들을 섹션으로 나눌 수있는 가장 좋은 방법은 무엇입니까? 대답이있는 경우를 대비하여이 질문을 다시 열어보십시오 ... – Sasha

답변

1

싸구려 해킹 방법 :

A을 반대하는 nameOfRelevantB 같은라는 카테고리 방법을 추가 아마하는에 저장하는에 클래스 메소드에 전달, 글로벌로 myC를 설정 (또는 파일 로컬 정적) nameOfRelevantBNSFetchedResultsControllersectionNameKeyPath으로 설정하십시오.

nameOfRelevantB은 제공된 C와 일치하는 B를 찾고 반환합니다.

명백한 단점은 한 번에 하나의 관련 C가있는 것으로 축소된다는 것입니다.

귀하의 앱에서 가져온 결과 컨트롤러가 대기열 또는 스레드와 일대일 관계를 유지하고 해당 C를 대기열 또는 스레드 컨텍스트로 저장한다는 규칙을 도입하면 문제를 개선 할 수 있지만 그 다음에는 대기열 또는 스레드 컨텍스트로 해당 C를 저장해야합니다. 수동 UITableViewDataSource 어쨌든 결과를 메인 대기열/스레드로 다시 포팅하십시오.

사용자 정의 데이터 소스를 작성하려는 경우 NSFetchedResultsControllerDelegate으로 만들면 [파일 정적] 전역을 피하면서 자신의 의도대로 섹션을 나눌 수 있습니다.

더 철저한 솔루션 :

당신이 당신의 NSManagedObject 서브 클래스에 valueForUndefinedKey:을 무시하고 직접 키 경로에 관련 C의 objectID를 둘 수 있었다. 관리 대상 개체 ID는 URIRepresentation이고 NSURLabsoluteString이므로 명시 적으로 안전합니다. 그런 다음 각 A는 키 경로에서 문자열 URI를 가져올 수 있으며 해당 컨텍스트의 영구 저장소 코디네이터에게 managedObjectIDForURIRepresentation을 요청한 다음 existingObjectWithID:error:에 대해 컨텍스트에 질문하여 관련 C를 얻을 수 있습니다. C가 있으면 해당 ID B.

그러면 모든 유형의 전역 상태없이 원하는 것을 얻을 수 있습니다. NSFetchedResultsController을 직접 사용하여 섹션을 결정할 수있는 주요 경로를 제공하십시오.

예.주요 단서는 객체 ID, 따라서 URI가 초기 객체의 생성 및 저장 첫간에 변경 될 될 것이다

// get a URI for the relevant myC and prefix it with an '@' 
// so that it's definitely clearly not an ordinary property 
fetchedResults.sectionNameKeyPath = 
     [NSString stringWithFormat:@"@%@", 
       [[myC.objectID URIRepresentation] absoluteString]]; 

... in your subclass for A ... 

- (id)valueForUndefinedKey:(NSString *)key 
{ 
    // check that the key begins with the magic '@' symbol 
    if(![key length] || [key characterAtIndex:0] != '@') 
     return [super valueForUndefinedKey:key]; 

    // get the original URL 
    NSString *URLString = [key substringFromIndex:1]; 
    NSURL *URL = [NSURL URLWithString:URLString]; 

    // transform the URL into the relevant instance of C 
    NSManagedObjectID *objectID = [self.context.persistentStoreCoordinator 
        managedObjectIDForURIRepresentation:URL]; 
    NSError *error = nil; 
    MyCClass *myC = [self.context existingObjectWithID:objectID error:&error]; 

    // check that we got an appropriate instance and didn't 
    // generate an error 
    if(!myC || error) return [super valueForUndefinedKey:key]; 

    /* 
     code here to find the appropriate B and return a suitable title 
    */ 
} 

(안된 직접 여기 입력). 컨텍스트를 이미 저장했다면 오브젝트 ID는 상점에있는 동안 동일하게 유지됩니다.

관련 문제