관심이있는 파일이 내 응용 프로그램이 아닌 다른 것으로 변경된 경우이를 감지하는 파일 모니터링 서비스를 구현하는 클래스가 있습니다. 나는 파일을 열고 (O_EVTONLY
플래그로) 파일 기술자를 DISPATCH_SOURCE_TYPE_VNODE
타입의 그랜드 센트럴 디스패치 소스에 바인딩하는 표준 기술을 사용한다. 이벤트가 생기면 메인 스레드에 NSNotificationCenter
의 postNotificationName:object:userInfo:
을 알리고 내 애플리케이션 대리인에게 옵저버를 호출합니다. 여태까지는 그런대로 잘됐다. 그것은 위대한 작품. 하지만 일반적으로 트리거 이벤트가 속성 변경 인 경우 (즉, 플래그가 dispatch_source_get_data()
에서 반환 될 때 설정 됨) 보통 간격이 두 개인 이벤트가 발생합니다. 모니터링중인 객체가 touch(1)
인 경우 문제가 쉽게 표시됩니다. 나는 이것이 파일의 mtime과 atime이 비 원자 적으로 설정 되었기 때문에 이것이 사실 일지는 모르지만 나는 이것을 검증 할 수 없다고 가정한다. 이것은 내 관찰자에게 보내지는 허위 통보로 이어질 수 있으며 경쟁 조건 등이 발생할 수 있습니다.GCD 파일 시스템 이벤트 합치기
이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 나는 마지막 이벤트가 수신 된 타임 스탬프를 저장하고 현재 이벤트가이 타임 스탬프보다 일정 시간 (수십 밀리 초) 뒤에있는 경우에만 알림을 보냈다 고 생각했습니다. 합리적인 솔루션처럼 들릴까요?
감사합니다. 나는 첫 번째 옵션을 사용하여 이벤트가 수신 된 시간 (모니터 클래스에 저장 됨)을 이전 이벤트와 비교하고 창이있는 경우 무시합니다. 추가로 이상한 일이 발생합니다. 특정 파일 만 이중 이벤트를 제공하며 최대 2 초까지 지연 될 수 있습니다. 또한 모달 경고를 표시하면 모든 내용이 차단되므로 두 번째 이벤트는 반환 될 때까지 연기됩니다. 내 알림 처리기에서 수신 된 모든 것을 버리고 경고가 해제 된 후 제한 시간대를 연장합니다. 그것은 효과가 있지만 나는 그것에 대해 너무 기뻐하지 않습니다. –