2014-04-08 2 views
0

나는 coredata에서 결과를 가져 오는 배열이 하나 있는데, 객체가 이고 범위가 myObjId입니다.다른 객체 유형을 가진 Array를 신속하게 처리 할 수 ​​있습니다.

그리고 난 내 MapViewMKAnnotation을 가지고, 그래서 Id와 사용자 정의 주석과 배열이 있습니다

self.mapView.annotations 반환 객체 CustomPinAnnotationmyId 속성을.

내가하고 싶은 일은지도에서 기존 핀을 다시로드하지 않고이 두 결과를 동기화하는 것입니다. CoreData에서 결과 배열에없는 annotations 배열의 데이터를 찾는 방법은 무엇입니까?

-(BOOL)isAlreadyDisplayOnMap:(NSNumber*)pinId { 
    for(CustomPinAnnotation *an in self.mapView.annotations) { 
     if(![an isKindOfClass:[MKUserLocation class]]) { 
      if([an.favourId integerValue] == [pinId integerValue]) { 
       return YES; 
      } 
     } 
    } 
    return NO; 
} 

을하지만이 몹시 느리고 배열을 비교하는 더 좋은 방법이 있어야한다 :

나는 방법은 주석이 추가됩니다 바로 전에 확인을 썼다.

+0

당신이 무엇을 알고지도보기의'annotations' 배열에 의존하지 않아도 정방향 –

+0

참고 반복 빠른 루프입니다 특수 효과가지도 상에 있습니다. 지도의 _own_ "목록"을지도 상에 유지할 수 있지만 pinId에 의한 _immediate_ 질의를 지원하는 구조 (pinId로 키가있는 NSDictionary와 같습니다). – Anna

+0

기존 코드에서 완전히 관련이 없지만 ** if *인지 확인하는 대신 ** 객체 **가 찾고있는 클래스 ('CustomPinAnnotation')인지 확인하기 위해'if' 조건을 변경하는 것이 좋습니다. *'MKUserLocation'. 이 방법을 사용하면 사용자 정의 속성 액세스가 실패하지 않을 것이라는 확신을 가질 수 있으며 두 가지 클래스 유형 이상이있을 가능성을 설명합니다. – Anna

답변

1

당신은 블록을 사용하여 시도 할 수 있습니다 : 루프에 대한

 __block BOOL alreadyDisplayed; 
    [self.mapView.annotations enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     CustomPinAnnotation *an = (CustomPinAnnotation *)obj; 
      if(![an isKindOfClass:[MKUserLocation class]]) { 
      if([an.favourId integerValue] == [pinId integerValue]) { 
       alreadyDisplayed = YES; 
       *stop = YES; 
      } 
      } 
    }]; 
관련 문제