호출 할 때 이벤트 스택 또는 타이머 스택 (또는 API에서 사용하는 메커니즘)에서 이미 대기중인 선택기 이벤트를 취소 할 수 있는지 아는 사람이 performSelector:withObject:afterDelay
있습니까?
이 이벤트 스택을 사용하여 TabBar 탭 내에서 이미지의 속성을 변경했으며, 때로는 빠르게 실행되는 for 루프에서 최대 10 초 분량의 변경 사항을 대기열에 넣었습니다. 어쩌면 5 밀리 초 정도였습니다.
사용자가 탭을 전환하면 문제가 발생합니다. 예를 들어 탭 # 4가 활성화 되 자마자 표시되는 이미지에 대해 이미지 변경이 대기열에있는 경우 사용자가 빠르게 탭 # 3으로 전환 한 다음 다시 탭으로 돌아갑니다. # 4 … 이렇게하면 이전 대기열이 계속 재생되는 동안 10 초 분량의 변경 사항이 다시 대기열에 추가됩니다. 충분히 빠르게 전환하면 대기열에 약 2 ~ 3 초가 추가됩니다. 스트림이 문제였습니다.
그래서 새 스택을 넣기 전에 이전 스택 변경 사항을 취소 할 방법이 필요했습니다.
재생 기능에 호크 아이드 이벤트 필터를 추가하여이 문제에 대한 대체 솔루션을 이미 생각해 냈기 때문에이 쿼리를 과거형으로 작성하고 있습니다. 하지만 이벤트 취소가 가능한지 궁금합니다. 그런 지식이 앞으로도 도움이 될 것 같아서요. 도움을 주셔서 감사합니다 🙂
답변
[NSObject cancelPreviousPerformRequestsWithTarget:]
또는
[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]
이 target
있는 원래의 목적 performSelector:afterDelay:
이라고했다.
예를 들면 :
// schedule the selector
[self performSelector:@selector(mySel:) withObject:nil afterDelay:5.0];
// cancel the above call (and any others on self)
[NSObject cancelPreviousPerformRequestsWithTarget:self];
설명 의 끝 부분에있는 apple 문서를 참조하십시오 performSelector:withObject:afterDelay:
.
답변
이전 수행 요청을 모두 취소하려면 다음을 사용할 수 있습니다.
[NSObject cancelPreviousPerformRequestsWithTarget:self];
답변
” cancelPreviousPerformSelector
“와 일치하는 “performSelector”를 찾고 있다면 그렇지 않습니다. (어, 애플, 왜 나 한테 그렇게하는거야 ???)
“일치”방법은 다음과 같습니다.
performSelector
cancelPreviousPerformRequestsWithTarget
(문서를 검색하지 않고 기억하기 더 어렵게 만드십시오.)
답변
NSRunLoop 문서를 확인하십시오. 원하는-cancelPerformSelectorsWithTarget: