싸구려 해킹 방법 :
이 A
을 반대하는 nameOfRelevantB
같은라는 카테고리 방법을 추가 아마하는에 저장하는에 클래스 메소드에 전달, 글로벌로 myC
를 설정 (또는 파일 로컬 정적) nameOfRelevantB
을 NSFetchedResultsController
에 sectionNameKeyPath
으로 설정하십시오.
nameOfRelevantB
은 제공된 C와 일치하는 B를 찾고 반환합니다.
명백한 단점은 한 번에 하나의 관련 C가있는 것으로 축소된다는 것입니다.
귀하의 앱에서 가져온 결과 컨트롤러가 대기열 또는 스레드와 일대일 관계를 유지하고 해당 C를 대기열 또는 스레드 컨텍스트로 저장한다는 규칙을 도입하면 문제를 개선 할 수 있지만 그 다음에는 대기열 또는 스레드 컨텍스트로 해당 C를 저장해야합니다. 수동 UITableViewDataSource
어쨌든 결과를 메인 대기열/스레드로 다시 포팅하십시오.
사용자 정의 데이터 소스를 작성하려는 경우 NSFetchedResultsControllerDelegate
으로 만들면 [파일 정적] 전역을 피하면서 자신의 의도대로 섹션을 나눌 수 있습니다.
더 철저한 솔루션 :
당신이 당신의 NSManagedObject
서브 클래스에 valueForUndefinedKey:
을 무시하고 직접 키 경로에 관련 C의 objectID
를 둘 수 있었다. 관리 대상 개체 ID는 URIRepresentation
이고 NSURL
은 absoluteString
이므로 명시 적으로 안전합니다. 그런 다음 각 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는 상점에있는 동안 동일하게 유지됩니다.
'B 그룹으로 그룹화'라고 말하면 출력 배열을 정렬하는 것 이상의 의미를 갖게되어 지정된 B로 C에 연결된 As가 인접하게됩니다. – Tommy
UITableView에서 그룹화하는 것을 의미하므로 연속되는 것 위에는 C.name이있는 섹션 헤더가 있습니다. 나는 당신이이 길로 향하고있는 곳을 본 것 같아 - 나는 그들의 b.c.name에 A의 배열을 정렬 할 수있다, 네? 그 생각을하지 않았다. 그들을 섹션으로 나눌 수있는 가장 좋은 방법은 무엇입니까? 대답이있는 경우를 대비하여이 질문을 다시 열어보십시오 ... – Sasha