在Cocoa(Objective-C)中,如何使用后台线程以编程方式同时对一组NSWindow实例进行 ?
如果你打电话给deminiaturize:'在NSWindow实例上,它将在deminiaturization过程的持续时间内阻塞主线程(约0.3秒)。如果你指示一系列窗口进行deminiaturize,他们将一次这样做,累积一段时间,一直阻塞主线程。可以使用后台线程实现所需的影响,但这(正确地)会引发控制台日志错误。
在0.3秒或更短的时间内安全地使一组5个以上的窗口去除个体化的能力将是理想的。有没有办法从deminiaturization中删除动画,以加快进程?是否有另一种方法可以将窗口恢复到屏幕而不需要调用' deminiaturize:'?
答案 0 :(得分:3)
通过使用setReleasedWhenClosed:
,close
和makeKeyAndOrderFront:
的组合,可以在没有任何动画(即即时)的情况下有效地对一组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:
的行为,这会导致窗口成为关键窗口。)