1

테이블보기와 @synchronized 구조에 대한 질문을하고 싶습니다. 사용자가 테이블 셀을 계속 두드려도 didSelectRowAtIndexPath 코드를 한 번 실행해야합니다 ...UITableViewDelegate 로직에 대한 동기화 된 액세스

게임의 메뉴로 사용되는 테이블이 있습니다. didSelectRowAtIndexPath에 구현 된 로직에 대한 동기화 된 액세스를 제공하고 싶습니다.

내가 다음 코드 worte :

//condition = YES in init code 

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     @synchronized(self) 
     { 
      if(!condition) 
      { 
       NSLog(@"multiple execution is not allowed..."); 
       return; 
      } 
      condition = NO; 
      ... 
      //code 
      ... 
     } 
    } 

나는 IOS 4.3.4 내 ipone 3GS에 테스트를하고 일을 (내가 테스트를하게하고, 동작이 예상 될 때)하지만 내 클라이언트는 자신의 3g에 그것을 테스트 ios 3.x가 설치되어 있으면 작동하지 않는 것 같습니다.

GCD (코드를 dispatch_once()에 넣음으로써)를 사용하여 생각했지만 ios 4.x부터 지원되었습니다.

@synchronized이 내 전화에서 작동하지 않는 이유에 대한 통찰력을 얻었습니까?

감사합니다.

답변

0

@synchronized은 여기에 필요하지 않아야합니다.

  • 위임 호출은 주 스레드에서 이루어지기를 기대할 수 있습니다 (호출하지 않는다고 가정).
  • dispatch_once 이례적인 선택입니다. 괜찮다고 확신하는 경우 iOS 3. pthread_once을 시도해보십시오. 가변적 인 전역 상태를 사용하기 때문에 이상합니다. IOW, "나는 오직 한 테이블 만 만들고 싶다."
  • BOOL 테스트가 빠릅니다.

내 생각 엔? 테이블이 제거되고 (보기 언로드) 다시로드 할 때 재 작성되지 않을 수 있습니다.

+0

감사합니다. dispatch_once를 사용하여 테이블 행을 한 번 두드리는 것과 관련된 코드를 한 번 실행하는 방법을 찾았습니다. didSelectRowAtIndexPath 구현 내에서 중단 점을 설정하여 문제를 확인하고 중단 점에서 멈추는 동안 다른 시간을 두드리고 didSelectRowAtIndexPath에 다른 스레드가 입력되어 경쟁 조건이 발생했습니다 .. – notsoux

+0

흠 .. 무슨 말을 해야할지 모르겠습니다. 확실한 경우에는 메인 스레드에서만 호출하십시오. 우연히 * 장애인 * objc 또는 C++ 예외가 있습니까? 그렇다면 활성화 된 상태로 사용해보십시오. 일반적으로, 나는 논리를 분리 된 방법으로 끌어 낸다. 그렇지 않으면 스레드 안전하지 않은 프로그램의 다른 부분이있을 수 있습니다. 그렇지 않으면 초기화되지 않고 파격적으로 파괴 될 수 있습니다. – justin