2016-09-21 49 views
0

正如標題所示,當我的狀態欄菜單打開並且另一個線程觸發NSAlert時,UI會凍結。當NSMenu打開時出現NSAlert會導致UI凍結

大概這是因爲這兩個東西都在主線程上運行。但由於我正在處理NSAlert和NSMenu,我不是在主線程上運行這些嗎?

NSAlert代碼

func showWallpaperUpdateErrorAlert(messageText: String, informativeText: String) { 
    DispatchQueue.main.async { 
     NSApp.activate(ignoringOtherApps: true) 

     let updateErrorAlert = NSAlert() 
     updateErrorAlert.messageText = messageText 
     updateErrorAlert.informativeText = informativeText 
     updateErrorAlert.addButton(withTitle: "OK") 
     updateErrorAlert.runModal() 
    } 
} 

NSMenu代碼

func createStatusBarMenu() { 
    // Status bar icon 
    guard let icon = NSImage(named: "iconFrame44") 
     else { NSLog("Error setting status bar icon image."); return } 
    icon.isTemplate = true 
    statusBarItem.image = icon 

    // Create Submenu items 
    let viewOnRedditMenuItem = NSMenuItem(title: "View on Reddit...", action: #selector(viewOnRedditAction), keyEquivalent: "") 
    viewOnRedditMenuItem.target = self 

    let saveThisImageMenuItem = NSMenuItem(title: "Save This Image...", action: #selector(saveThisImageAction), keyEquivalent: "") 
    saveThisImageMenuItem.target = self 

    // Add to title submenu 
    let titleSubmenu = NSMenu(title: "") 
    titleSubmenu.addItem(descriptionMenuItem) 
    titleSubmenu.addItem(NSMenuItem.separator()) 
    titleSubmenu.addItem(viewOnRedditMenuItem) 
    titleSubmenu.addItem(saveThisImageMenuItem) 

    // Create main menu items 
    titleMenuItem = NSMenuItem(title: "No Wallpaperer Image", action: nil, keyEquivalent: "") 
    titleMenuItem.submenu = titleSubmenu 
    titleMenuItem.isEnabled = false 
    getNewWallpaperMenuItem = NSMenuItem(title: "Update Now", action: #selector(getNewWallpaperAction), keyEquivalent: "") 
    getNewWallpaperMenuItem.target = self 

    let preferencesMenuItem = NSMenuItem(title: "Preferences...", action: #selector(preferencesAction), keyEquivalent: "") 
    preferencesMenuItem.target = self 

    let quitMenuItem = NSMenuItem(title: "Quit Wallpaperer", action: #selector(quitAction), keyEquivalent: "") 
    quitMenuItem.target = self 

    // Add to main menu 
    let statusBarMenu = NSMenu(title: "") 
    statusBarMenu.addItem(titleMenuItem) 
    statusBarMenu.addItem(NSMenuItem.separator()) 
    statusBarMenu.addItem(getNewWallpaperMenuItem) 
    statusBarMenu.addItem(NSMenuItem.separator()) 
    statusBarMenu.addItem(preferencesMenuItem) 
    statusBarMenu.addItem(quitMenuItem) 

    statusBarItem.menu = statusBarMenu 

    statusBarMenu.delegate = self 
} 
+0

嗨,你的OS X版本是什麼?它是OS X 10.12(Sierra)? – DoN1cK

+0

是的,我在塞拉利昂。 – yesthisisjoe

回答

1

在我的情況的解決方案是顯示警報之前關閉該菜單。

我不得不從NSStatusItemmenu物業訪問菜單,並呼籲cancelTrackingWithoutAnimation()(經常cancelTracking()是不平穩)。無論出於何種原因,我還必須在主線外進行此操作。

func showWallpaperUpdateErrorAlert(messageText: String, informativeText: String) { 
    statusBarItem.menu?.cancelTrackingWithoutAnimation() // This is new 

    DispatchQueue.main.async { 
     NSApp.activate(ignoringOtherApps: true) 

     let updateErrorAlert = NSAlert() 
     updateErrorAlert.messageText = messageText 
     updateErrorAlert.informativeText = informativeText 
     updateErrorAlert.addButton(withTitle: "OK") 
     updateErrorAlert.runModal() 
    } 
} 
+0

它完成這項工作。 – DoN1cK

相關問題