在可可(Objective-C)中,如何在不使用后台线程的情况下以编程方式同时使一组NSWindow实例小型化?

如果在NSWindow实例上调用“ deminiaturize:”,它将在去小型化过程的持续时间内(约0.3秒)阻塞主线程。如果您指示一组窗口缩小以使其小型化,则它们将一次执行一次,累计花费相当长的时间,始终阻塞主线程。可以使用后台线程来实现所需的效果,但这(正确)会引发控制台日志错误。

在0.3秒或更短的时间内安全地使5个以上的窗口组小型化的能力将是理想的。是否有办法从小型化中删除动画以加快处理过程?是否有另一种方法可以将窗口还原到屏幕而无需调用“ deminiaturize:”?

最佳答案

通过使用setReleasedWhenClosed:closemakeKeyAndOrderFront:的组合,可以有效地使NSWindows数组小型化,而无需任何动画(即即刻进行)-并且无需实际取消分配对象。

目标C:

void deminiaturizeWindowsWithoutAnimation(NSArray<NSWindow *> *windows) {
    for (NSWindow * window in windows) {
        if ([window isMiniaturized]) {
            BOOL old_isReleasedWhenClosed = [window isReleasedWhenClosed];
            [window setReleasedWhenClosed:false];
            [window close];
            [window makeKeyAndOrderFront: nil];
            [window setReleasedWhenClosed:old_isReleasedWhenClosed];
        }
    }
}


迅速:

func deminiaturizeWithoutAnimation(windows: [NSWindow]) {
    for window in windows {
        guard window.isMiniaturized else { continue }
        let old_isReleasedWhenClosed = window.isReleasedWhenClosed
        window.isReleasedWhenClosed = false
        window.close()
        window.makeKeyAndOrderFront(nil)
        window.isReleasedWhenClosed = old_isReleasedWhenClosed
    }
}


可以从主线程调用这些函数。在macOS Sierra上测试。

如果需要,可以将makeKeyAndOrderFront:替换为orderFront:orderBack:,以避免更改键窗口。 (尽管makeKeyAndOrderFront的行为复制了deminiaturize:的行为,这导致该窗口成为关键窗口。)

07-27 23:17