0

나는 이벤트가 포함 된 사전을 가지고 있습니다. 하나 개의 이벤트에 대한 형식이사전에 동일한 값이 둘 이상인 경우 효과적인 방법을 알아야합니다.

{ 
    eventTime = 53'; 
    eventType = "Yellow Card"; 
    gameID = 0; 
    name = Mike; 
    selectedTeam = homeTeam; 
} 

처럼 보인다 그리고 나는 NSMutableArray에 모든 이벤트를 저장했습니다. 클라이언트는 시간이 갈수록 이벤트를 삽입합니다 (축구 경기의 경우). 이제 플레이어가 두 개의 노란색 카드를 가지고있어 이미지를 다른 이미지로 바꿀 수있는 경우 내 UITableView을 채울 때를 확인해야합니다. 내가 지금하고있는 방식은 이제 이렇게 생겼고 정말 좋아하지 않고 실제로 작동하지 않습니다.

if ([typeEvent isEqualToString:@"Yellow Card"]){ 
    int i= 0; 
    for (id obj in _events) 
    { 
     if ([[obj valueForKeyPath:[NSString stringWithFormat:@"eventType"]] isEqualToString:@"Yellow Card"] && [[obj valueForKeyPath:[NSString stringWithFormat:@"name"]] isEqualToString:[gameInfoObject valueForKeyPath:[NSString stringWithFormat:@"name"]]]) { 
      i++; 
      if (i >= 2) { 
       imageType = [UIImage imageNamed:@"Yellow&Red.png"]; 
      } 
     } 
    } 
} 

내 jQuery과에 나는이 그래서 당신이 이벤트 유형이 동일 행사의 배열에 1 개 이상의 이벤트가있는 경우 그러니까 기본적으로

NSMutableDictionary *gameInfoObject =[_events objectAtIndex:indexPath.row]; 

위의 코드에 무엇을 무엇인지 알고

"옐로우 카드 노란색 & 레드 "당신이 NSCountedSet를 사용에

+1

질문과 관련이 없지만'[NSString stringWithFormat : @ "StringWithNoFormattingSpecifiers"]'는'@ "StringWithNoFormattingSpecifiers"'를 작성하는 데 비용이 많이 듭니다. '-valueForKeyPath :'를 하나의 요소만을 가진 경로로 사용하지 마십시오. '-valueForKey :'를 사용할 수는 있지만, 키가 하드 코딩 된 경우에는 그렇게하지 마십시오. 사전의 경우'-objectForKey :'를 사용하십시오. 다른 객체의 경우 속성에 대한 getter를 호출하기 만하면됩니다. –

+0

지적 해 주셔서 감사합니다! 내가 열쇠에 대한 개체로 변경해야하지만 나는 @ "StringWithNoFormattingSpecifiers"구현하는 방법을 얻지 못했습니다. 이 줄이 어떻게 보이나요? : [[obj objectForKey : [NSString stringWithFormat : @ "eventType"]] @KenThomases –

+0

[obj objectForKey : [NSString stringWithFormat : @ "eventType"]] obj [@ "eventType "] Modern Objective-C – dirkgroten

답변

0

NSArray에서 제공하는 빠른 열거 자 메서드 중 하나를 사용하여 시작할 것입니다.

NSIndexSet *matchingSet = [_events indexesOfObjectsPassingTest:^BOOL(id obj, 
            NSUInteger idx, 
            BOOL *stop){ 
    return ([gameInfoObject[@"name"] isEqualToString:obj[@"name"] && [obj[@"eventType"] isEqualToString:@"Yellow Card"]) 
    }]; 

if (matchingSet.count >= 2) { 
    imageType = [UIImage imageNamed:@"Yellow&Red.png"]; 
} 
+0

이 답변은 원래 소스와 가장 가까운 곳에 있습니다. –

0

봐 도움을

감사합니다"그 경기의 이름은 나는 이미지를 변경해야 " 귀하의 개체에 대한. 일정한 시간 조회 및 카운트가 제공됩니다.

0

몇 가지 방법으로이 작업을 수행 할 수 있습니다. 개인적으로 이벤트 객체를 사용하는 것이 코드에서 가장 잘 읽을 수 있지만, NSArrayNSDictionary과 같은 간단한 객체를 사용하려는 경우 두 개의 추가 NSMutableArray 또는 하나의 추가 NSMutableDictionary 또는 하나의 추가로 쉽게 해결할 수 있습니다. NSCountedSet.

NSMutableSet의 :

NSMutableSet *yellowCardPlayers; 
NSMutableSet *redCardPlayers; 

- (void)receiveEvent:(NSDictionary *)event { 
    [_events addObject:event]; 
    if ([event[@"eventType"] isEqualToString:@"Yellow Card"]) { 
    if ([yellowCardPlayers containsObject:event[@"name"]]) { 
     if ([redCardPlayers containsObject:event[@"name"]]) { 
     // How did a player get a yellow card after already being ejected from the game?! :) 
     } else { 
     [redCardPlayers addObject:event[@"name"]]; 
     } 
    } else { 
     [yellowCardPlayers addObject:event[@"name"]]; 
    } 
    } 
} 

NSMutableDictionary :

NSMutableDictionary *playerYellowCards; 

- (void)receiveEvent:(NSDictionary *)event { 
    [_events addObject:event]; 
    if ([event[@"eventType"] isEqualToString:@"Yellow Card"]) { 
    NSNumber *numberOfYellowCards = [playerYellowCards objectForKey:event[@"name"]]; 
    if (![[playerYellowCards allKeys] containsObject:event[@"name"]]) { 
     [playerYellowCards addObject:@(1) forKey:event[@"name"]]; 
    } else { 
     [playerYellowCards addObject:@([playerYellowCards[event[@"name"]] integerValue]+1) forKey:event[@"name"]]; 
    } 
    } 
} 

NSCountedSet :

NSCountedSet *playerYellowCards; 

- (void)receiveEvent:(NSDictionary *)event { 
    [_events addObject:event]; 
    if ([event[@"eventType"] isEqualToString:@"Yellow Card"]) { 
    [playerYellowCards addObject:event[@"name"]]; 
    } 
} 
0

사용 자 NSPredicate는 배열을 필터링 한 후 결과를 계산하려면 :

NSPredicate *yellowFlagFilter = [NSPredicate predicateWithFormat:@"eventType == %@ AND name == %@",@"Yellow Card", gameInfoObject.name]; 
NSArray *yellowCards = [_events filteredArrayUsingPredicate:yellowFlagFilter]; 
if ([yellowCards count] > 1) { 
    imageType = [UIImage imageNamed:@"Yellow&Red.png"]; 
} 
관련 문제