同时以编程方式对一系列NSWindows进行去除?

时间:2016-09-23 11:20:11

标签: objective-c multithreading macos cocoa nswindow

在Cocoa(Objective-C)中,如何使用后台线程以编程方式同时对一组NSWindow实例进行

如果你打电话给deminiaturize:'在NSWindow实例上,它将在deminiaturization过程的持续时间内阻塞主线程(约0.3秒)。如果你指示一系列窗口进行deminiaturize,他们将一次这样做,累积一段时间,一直阻塞主线程。可以使用后台线程实现所需的影响,但这(正确地)会引发控制台日志错误。

在0.3秒或更短的时间内安全地使一组5个以上的窗口去除个体化的能力将是理想的。有没有办法从deminiaturization中删除动画,以加快进程?是否有另一种方法可以将窗口恢复到屏幕而不需要调用' deminiaturize:'?

1 个答案:

答案 0 :(得分:3)

通过使用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:的行为,这会导致窗口成为关键窗口。)