UI 요소에 NSStatusItem
과 메뉴가 포함 된 애플리케이션이 있습니다. 내 응용 프로그램 내에서 일부 작업을 수행하기 위해 비동기 적으로 NSTask
을 사용 중이며 NSFileHandleReadCompletionNotification
을 사용하여 얻은 출력을 사용하여 메뉴를 업데이트합니다. 그러나 이제는 메뉴를 클릭하여 열 때마다 메인 runloop이 NSEventTrackingRunLoopMode
으로 바뀌고 알림 게시가 실패합니다. 기본적으로 메뉴를 열면 기본 스레드에서 아무 작업도 수행되지 않습니다. 이제 this 게시물에서 유사한 문제가 발견되었지만 허용 된 해결책은 도움이되지 않습니다. NSNotificationCenter
의 경우 NSRunloopDefaultMode
을 차단해서는 안됩니다. 이 bahaviour를 바꿀 어쨌든 있습니까 ??? 아무도 도와 줄 수 있니 ???메인 스레드 실행 루프가 오프닝 nsmenu에서 차단되었습니다.
3
A
답변
2
내가 추측하는 바라면 NSTask
의 stdout
을 나타내는 NSFileHandle
이 있고 -readInBackgroundAndNotify
이라고 물었습니다.
발견 한 바와 같이 이것은 런 루프가 기본 모드에있는 경우에만 알려주는 것입니다. runloop이 다른 모드 (예 : 메뉴가 열려있을 때)로 들어가면 알림은 기본 runloop에 대기 상태가되고 runloop이 기본 모드로 다시 들어갈 때까지 대기합니다.
은 당신이 대신 사용하려는 것은 -readInBackgroundAndNotifyForModes:
방법, 당신은 NSDefaultRunLoopMode
및 NSEventTrackingRunLoopMode
을 모두 포함하는 배열을 전달하는 것입니다. 이렇게하면 runloop이 기본 모드 또는 이벤트 추적 모드에있을 때 사용 가능한 데이터를 알리려고한다는 것을 runloop에 알립니다.
감사합니다. .. 완벽하게 작동 :) –