2014-12-31 3 views
0

현재 데이터 집합에서 수행하는 사용자 지정 "정렬"이 있습니다. 이제 NSFetchedResultsController에서 fetchedObjects에 대해이 정렬을 수행해야합니다. 모든 테이블 데이터는 핵심 데이터 가져 오기 결과와 함께 사용되므로 데이터 소스를 일반 배열로 대체하는 것이 문제가되었습니다.NSFetchedResultsController에 대한 사용자 지정 NSSortDescriptor

NSFetchedResultsController는 NSSortDescriptors를 사용할 수 있기 때문에 이것이 최상의 경로 인 것처럼 보입니다. 문제는이 정렬 알고리즘을 사용자 지정 비교기로 변환하는 방법을 모른다는 것입니다.

가능하면이 값을 사용자 지정 비교기로 변환합니까? (NSFetchedResultsController를 사용하는 동안 원하는 정렬 된 결과를 얻지 못하는 경우). 본질적으로 '우선 순위'필드는 '높음', '보통'또는 '낮음'일 수 있으며 목록은 그 순서대로 정렬되어야합니다.

+(NSArray*)sortActionItemsByPriority:(NSArray*)listOfActionitemsToSort 
{ 
    NSMutableArray *sortedArray = [[NSMutableArray alloc]initWithCapacity:listOfActionitemsToSort.count]; 
    NSMutableArray *highArray = [[NSMutableArray alloc]init]; 
    NSMutableArray *normalArray = [[NSMutableArray alloc]init]; 
    NSMutableArray *lowArray = [[NSMutableArray alloc]init]; 

for (int x = 0; x < listOfActionitemsToSort.count; x++) 
{ 
    ActionItem *item = [listOfActionitemsToSort objectAtIndex:x]; 

    if ([item.priority caseInsensitiveCompare:@"high"] == NSOrderedSame) 
     [highArray addObject:item]; 
    else if ([item.priority caseInsensitiveCompare:@"normal"] == NSOrderedSame) 
     [normalArray addObject:item]; 
    else 
     [lowArray addObject:item]; 
} 

[sortedArray addObjectsFromArray:highArray]; 
[sortedArray addObjectsFromArray:normalArray]; 
[sortedArray addObjectsFromArray:lowArray]; 

return sortedArray; 
} 

정보 업데이트 NSComparisonResult 블록을 사용하지만 NSFetchedResultsController가

는 또한 I 정렬 할 수있는 필드를 계산 한 다음, 과도 코어 데이터 속성을 사용하려고하는 것이 허용되지 않는 시도 . 그러나 필드가 계산되기 전에 정렬이 수행되므로 작동하지 않습니다.

각 우선 순위 유형에 대해 섹션 설정을 시도했는데 성공했습니다. 하지만 올바른 순서로 표시되지 않고 분명히 핵심 데이터가있는 섹션을 주문할 수 없습니다.

다른 의견은 있습니까?

답변

0

어때?

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"priority" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) { 
     if ([obj1 isEqualToString:obj2]) { 
      return NSOrderedSame; 
     } else if ([obj1 isEqualToString:@"high"] || [obj2 isEqualToString:@"low"]) { 
      return NSOrderedAscending; 
     } else if ([obj2 isEqualToString:@"high"] || [obj1 isEqualToString:@"low"]) { 
      return NSOrderedDescending; 
     } 
     return NSOrderedSame; 
    }]; 
+0

나는 이것이 어떻게 작동하는지 이해하지 못합니다. 같은 순서로 정렬되면 두 객체를 정렬하지 않습니다. obj1은 항상 움직이는 객체입니까? – Spentak

+0

정상적인 정렬에서 작동하지만 NSFetchedResultsController는 비교자를 사용할 수 없습니다 : P – Spentak

관련 문제