2012-06-04 6 views
3

UI 요소에 NSStatusItem과 메뉴가 포함 된 애플리케이션이 있습니다. 내 응용 프로그램 내에서 일부 작업을 수행하기 위해 비동기 적으로 NSTask을 사용 중이며 NSFileHandleReadCompletionNotification을 사용하여 얻은 출력을 사용하여 메뉴를 업데이트합니다. 그러나 이제는 메뉴를 클릭하여 열 때마다 메인 runloop이 NSEventTrackingRunLoopMode으로 바뀌고 알림 게시가 실패합니다. 기본적으로 메뉴를 열면 기본 스레드에서 아무 작업도 수행되지 않습니다. 이제 this 게시물에서 유사한 문제가 발견되었지만 허용 된 해결책은 도움이되지 않습니다. NSNotificationCenter의 경우 NSRunloopDefaultMode을 차단해서는 안됩니다. 이 bahaviour를 바꿀 어쨌든 있습니까 ??? 아무도 도와 줄 수 있니 ???메인 스레드 실행 루프가 오프닝 nsmenu에서 차단되었습니다.

답변

2

내가 추측하는 바라면 NSTaskstdout을 나타내는 NSFileHandle이 있고 -readInBackgroundAndNotify이라고 물었습니다.

발견 한 바와 같이 이것은 런 루프가 기본 모드에있는 경우에만 알려주는 것입니다. runloop이 다른 모드 (예 : 메뉴가 열려있을 때)로 들어가면 알림은 기본 runloop에 대기 상태가되고 runloop이 기본 모드로 다시 들어갈 때까지 대기합니다.

은 당신이 대신 사용하려는 것은 -readInBackgroundAndNotifyForModes: 방법, 당신은 NSDefaultRunLoopModeNSEventTrackingRunLoopMode을 모두 포함하는 배열을 전달하는 것입니다. 이렇게하면 runloop이 기본 모드 또는 이벤트 추적 모드에있을 때 사용 가능한 데이터를 알리려고한다는 것을 runloop에 알립니다.

+0

감사합니다. .. 완벽하게 작동 :) –