2012-01-28 4 views
3

관련 NSSortDescriptor을 생성하는 switch 문이 있습니다. NSSortDescriptors 중 일부는 사용자 정의 comparator으로 block을 사용하고 있습니다 (CMTimes과 비교). 다음 코드는 정상적으로 작동하지만 NSSortDescriptorsCMTimes을 더 추가하고 싶습니다. block은 항상 동일하므로 block을 보유하는 variable을 만들면 지저분한 코드를 복사하여 붙여 넣을 필요가 없습니다. 나는 그것이 가능해야한다고 생각하지만 나는 그것이 작동하도록 할 수 없습니다. 어떤 도움을 주시면 감사하겠습니다. 고맙습니다!NSSortDescriptors의 블록 - 목표 C

NSSortDescriptor *sortDescriptor; 

switch (mode) { 
    case 1: 
     sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"startTime" ascending: YES comparator:^(id first, id second){ 
        CMTime time1 = [first CMTimeValue]; 
        CMTime time2 = [second CMTimeValue]; 
        if (CMTIME_COMPARE_INLINE(time1, <, time2)) 
         return NSOrderedAscending; 
        else if (CMTIME_COMPARE_INLINE(time1, >, time2)) 
         return NSOrderedDescending; 
        else 
         return NSOrderedSame; 
     }]; 
     break; 
    case 2: 
     sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"startTime" ascending: NO comparator:^(id first, id second){ 
        CMTime time1 = [first CMTimeValue]; 
        CMTime time2 = [second CMTimeValue]; 
        if (CMTIME_COMPARE_INLINE(time1, <, time2)) 
         return NSOrderedAscending; 
        else if (CMTIME_COMPARE_INLINE(time1, >, time2)) 
         return NSOrderedDescending; 
        else 
         return NSOrderedSame; 
     }]; 
     break; 
    case 3: 
     sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"info" ascending: YES]; 
     break; 
    case 4:  
     sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"info" ascending: NO]; 
     break; 
    default: 
     break; 
} 

답변

9

블록 변수를 복사하여 붙여 넣을 필요가 없도록 블록 변수를 만들 수 있습니다.

NSComparator comparisonBlock = ^(id first,id second) { 
    return NSOrderedAscending; 
}; 
[NSSortDescriptor sortDescriptorWithKey: @"startTime" ascending: YES comparator:comparisonBlock]; 
+0

감사합니다. DHamrick. 그건 완벽하게 작동합니다. 나는 블록을 조금 더 잘 이해한다고 생각합니다 ... – Simple99

1

물론, (해제하는 것을 잊지 마세요) 속성에 대한 @property (nonatomic, copy)를 사용하거나 당신의 할당하기 전에 블록을 정의합니다.

4

당신은

NSComparator myBlock = ^(id first, id second) { 
    CMTime time1 = [first CMTimeValue]; 
    CMTime time2 = [second CMTimeValue]; 
    if (CMTIME_COMPARE_INLINE(time1, <, time2)) 
     return NSOrderedAscending; 
    else if (CMTIME_COMPARE_INLINE(time1, >, time2)) 
     return NSOrderedDescending; 
    else 
     return NSOrderedSame; 
} 

이 당신에게 반환 형식 NSComparator와 블록 변수 myBlock을 만듭니다의 라인을 따라 뭔가를, 두 개의 ID 유형 인수 걸릴 수 있습니다.

sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"startTime" ascending: YES comparator:myBlock]; 

그리고 모든 것이 잘 작동합니다 :

그러면 예를 들어 전화를 할 수 있어야한다.

도움이 될만한 것이 있으면 알려주세요.

+0

Hi George. 웬일인지 나는 당신의 솔루션을 작동시킬 수 없다. 특히 ... (^ myBlock) (id, id)'. 방금 위의 DHamrick의 대답처럼 'myBlock'으로 대체하면 정상적으로 작동합니다. – Simple99

+0

미안하지만 그건 내 잘못 이었어. 당신은 내가 잘못 입력 한 것이 옳다. –