我有一個應用程序,其UI元素包括一個NSStatusItem
和一個菜單。在我的應用程序內部,我異步使用NSTask
來執行某些操作,並使用使用NSFileHandleReadCompletionNotification
獲取的輸出來更新菜單。但是現在,無論何時點擊並打開菜單,主循環進入NSEventTrackingRunLoopMode
,並且通知發佈失敗。所以基本上我的菜單打開,主線程上沒有任何操作。現在我發現this後的類似問題,但接受的解決方案似乎沒有幫助。我明白,對於NSNotificationCenter
,NSRunloopDefaultMode
一定不能被阻止。無論如何改變這個bahaviour?任何人都可以請幫忙?主線程Runloop在打開時被阻塞nsmenu
3
A
回答
2
我猜的是你有一個NSFileHandle
代表NSTask
的stdout
,你已經問它-readInBackgroundAndNotify
。
正如你所發現的那樣,這個問題只是在runloop處於默認模式時纔會通知。如果runloop進入另一種模式(比如當菜單打開時),那麼你的通知將在主要的runloop上排隊,並等待runloop重新進入默認模式。
你想要使用的是-readInBackgroundAndNotifyForModes:
方法,你可以傳遞一個包含NSDefaultRunLoopMode
和NSEventTrackingRunLoopMode
的數組。這將向runloop指出,當runloop處於默認模式或事件跟蹤模式時,您希望收到任何可用數據的通知。
相關問題
- 1. 狀態項阻塞主線程(NSMenu阻止NSSpeechRecognizer檢測到聲音)
- 2. 如何在主UI線程被阻塞時顯示progressdialog?
- 3. 如何在主線程被阻塞時更新CALayer的內容?
- 4. UI線程被阻塞
- 5. Netty線程被阻塞
- 6. 隊列阻塞主線程
- 7. MaxDegreeOfParallelism阻塞主線程?
- 8. NSTask阻塞主線程
- 9. NSoperationQueue阻塞主線程
- 10. performSelector:onThread:當目標線程被阻塞時
- 11. 當主線程在IOS中被阻塞時,UIAlertView在線程中關閉
- 12. 當主線程被阻塞時,UIActivityIndicatorView如何不停止?
- 13. 主線程被阻塞時避免表視圖didSelectRowIndexPath動作
- 14. 套接字線程在接收時阻塞主線程
- 15. 在gui事件後阻塞主線程
- 16. 當打開FIFO時,爲什麼進程被阻塞
- 17. 阻止阻塞的線程阻塞
- 18. 當主線程在Cocoa應用程序中被阻塞時UI不會更新
- 19. c# - 線程池完成時通知,不阻塞主線程
- 20. Java線程被阻塞的狀態
- 21. log4net的導致線程被阻塞
- 22. 確定線程是否被阻塞
- 23. 檢查pthread線程是否被阻塞
- 24. 找出線程被阻塞的位置
- 25. 檢測被阻塞的線程
- 26. MVC Ajax請求不阻塞主線程
- 27. 更新tableView不會阻塞主線程
- 28. GKSession調用是否阻塞主線程?
- 29. 子窗口阻塞主線程
- 30. 爲什麼Handler.Post阻塞主線程
非常感謝! ..完美的作品:) –