2013-01-22 2 views
2

현재 잠금 문제로 보이는 문제로 코드가 계속 실행되지 않는 문제가 있습니다. 문제가 performSelector : @Synchronized 블록이 작동하는 방식에 기반하고 있다고 생각합니다. AfterDelay :. 잠금이 지연을 통해 지속되는지 또는 잠금 외부에서 스케줄 된 선택기입니까?@Background 및 afterDelay의 동기화 된 블록 및 선택 자

다음은 코드입니다. 기본적으로 locateEvents는 여러 번 호출되지만 새로운 이벤트 위치 데이터가 들어올 때마다 (즉, 계속 호출되는 경우) 한 번만 실행하면됩니다.

-(void) locateEvents 
{ 
    @synchronized(self) 
    { 
    if(!locating) 
    { 
     locating = true; 
     shouldLocate = false; 

     for(Event* e in provider.allEvents) 
     { 
      if(e.coordinate.latitude) 
       [self queueEventForMap:e]; 
     } 

     [self performSelector:@selector(stopLocating) withObject:nil afterDelay:1.0f]; 

     }else{ 
     shouldLocate = true; 
     } 
    } 

} 

-(void) stopLocating 
{ 
    locating = false; 

    if(shouldLocate) 
    [self locateEvents]; 

} 

답변

0

추가 테스트를 한 후 잠금이 예약 된 선택기를 따르지 않는 것으로 보입니다. 위의 문제는 스레드가 죽어 예약 된 선택기가 실행되지 않아 발생합니다.