2012-06-04 51 views
3

我有一個應用程序,其UI元素包括一個NSStatusItem和一個菜單。在我的應用程序內部,我異步使用NSTask來執行某些操作,並使用使用NSFileHandleReadCompletionNotification獲取的輸出來更新菜單。但是現在,無論何時點擊並打開菜單,主循環進入NSEventTrackingRunLoopMode,並且通知發佈失敗。所以基本上我的菜單打開,主線程上沒有任何操作。現在我發現this後的類似問題,但接受的解決方案似乎沒有幫助。我明白,對於NSNotificationCenterNSRunloopDefaultMode一定不能被阻止。無論如何改變這個bahaviour?任何人都可以請幫忙?主線程Runloop在打開時被阻塞nsmenu

回答

2

我猜的是你有一個NSFileHandle代表NSTaskstdout,你已經問它-readInBackgroundAndNotify

正如你所發現的那樣,這個問題只是在runloop處於默認模式時纔會通知。如果runloop進入另一種模式(比如當菜單打開時),那麼你的通知將在主要的runloop上排隊,並等待runloop重新進入默認模式。

你想要使用的是-readInBackgroundAndNotifyForModes:方法,你可以傳遞一個包含NSDefaultRunLoopModeNSEventTrackingRunLoopMode的數組。這將向runloop指出,當runloop處於默認模式或事件跟蹤模式時,您希望收到任何可用數據的通知。

+0

非常感謝! ..完美的作品:) –