테이블보기와 @synchronized
구조에 대한 질문을하고 싶습니다. 사용자가 테이블 셀을 계속 두드려도 didSelectRowAtIndexPath
코드를 한 번 실행해야합니다 ...UITableViewDelegate 로직에 대한 동기화 된 액세스
게임의 메뉴로 사용되는 테이블이 있습니다. didSelectRowAtIndexPath
에 구현 된 로직에 대한 동기화 된 액세스를 제공하고 싶습니다.
//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
이 내 전화에서 작동하지 않는 이유에 대한 통찰력을 얻었습니까?
감사합니다.
감사합니다. dispatch_once를 사용하여 테이블 행을 한 번 두드리는 것과 관련된 코드를 한 번 실행하는 방법을 찾았습니다. didSelectRowAtIndexPath 구현 내에서 중단 점을 설정하여 문제를 확인하고 중단 점에서 멈추는 동안 다른 시간을 두드리고 didSelectRowAtIndexPath에 다른 스레드가 입력되어 경쟁 조건이 발생했습니다 .. – notsoux
흠 .. 무슨 말을 해야할지 모르겠습니다. 확실한 경우에는 메인 스레드에서만 호출하십시오. 우연히 * 장애인 * objc 또는 C++ 예외가 있습니까? 그렇다면 활성화 된 상태로 사용해보십시오. 일반적으로, 나는 논리를 분리 된 방법으로 끌어 낸다. 그렇지 않으면 스레드 안전하지 않은 프로그램의 다른 부분이있을 수 있습니다. 그렇지 않으면 초기화되지 않고 파격적으로 파괴 될 수 있습니다. – justin