小编ken*_*nyc的帖子

在Interface Builder中的NSWindowController的nib中引用NSViewController的视图

如果您正在使用NSViewController,每个都有自己的XIB文件,有没有办法在NSWindowController的XIB文件中引用这些视图?我希望能够在我的NSWindowController中删除一个视图,并让Interface Builder了解该视图实际上是它可以从嵌入式NSViewController获取的视图.

MyWindowController.xib

[Objects]
-- MyViewController (Loaded from MyViewController.xib)
-- OtherViewController (Loaded from OtherViewController.xib)

[Window]
-- View
---- My View
---- Other View
Run Code Online (Sandbox Code Playgroud)

我希望Interface Builder知道它My View真的是来自的视图MyViewController.目前,我不得不手动将这些视图添加到窗口的内容视图中windowDidLoad.

- (void)windowDidLoad {
  ... snip ...

  [self.window.contentView addSubview:self.myViewController.view];
  [self.window.contentView addSubview:self.otherViewController.view];

  ... Configure constraints ...
}
Run Code Online (Sandbox Code Playgroud)

这是一个简化的示例,但在较大的情况下,可能有许多视图控制器在起作用,每个视图控制器都有自己的视图.我更喜欢在Interface Builder中设置他们的初始约束和布局,但我不确定如何.

macos cocoa interface-builder appkit

5
推荐指数
0
解决办法
303
查看次数

自动终止MacOS XPC服务的正确方法是什么?

我已经成功地遵循了守护进程和服务指南 - 创建XPC服务教程,以及SandboxedFetch示例代码,并且使用了新NSXPCConnection类的工作客户端/服务设置.

我还不完全清楚的是如何在服务应用程序完成其工作后正确地自行终止服务应用程序.我认识到,在许多情况下,服务预计仍然存在,但在我想到的用例中,该服务将仅用于进行一些我在主应用程序中不执行的处理.完成该处理后,没有理由保留服务应用程序.如果客户端稍后需要其他服务,则可以重新创建一个新服务.

由于服务是轻量级的,非nibbed,NSApplication我试图通过invalidate从内部调用来自我终止它applicationWillTerminate,但几乎每次都会触发EXC_BAD_ACCESS异常.调用invalidate该服务可以[NSXPCListener serviceListener]产生稍微不那么可靠的崩溃,但它仍然会崩溃.

invalidate从客户端应用程序内部调用NSXPCConnection也几乎每次都会生成一个EXC_BAD_ACCESS异常.

所以我很好奇正确的步骤顺序是干净地关闭XPC服务然后退出服务应用程序.理想情况下,服务在向客户端发出最后一次XPC调用后会自行终止.

附件是一个例外的堆栈跟踪之一的小屏幕截图.(是的,这是在服务中加载的webview.一旦webview完成加载,我希望服务自行终止)

在此输入图像描述

cocoa xpc foundation appkit nsxpcconnection

5
推荐指数
1
解决办法
1033
查看次数

你如何有条件地在 Xcode 项目中包含一个框架?

是否有可能有一个 Xcode 项目(最好是单个目标),在针对特定版本的 OS X / Xcode 构建时有条件地包含框架,但在针对另一个版本构建时不包含这些框架?

我想开始向我正在处理的应用程序添加对 El Capitan 的支持,但我想到的一些支持需要链接到优胜美地中不存在的框架。有没有办法配置 Xcode 项目,以便可以在 10.11 / Xcode 7 下使用框架构建相同的项目,但也可以在没有框架的情况下在 10.10 / Xcode 6 下构建(并且不会引发错误)?

我知道如何在运行时检查类或方法是否存在,但我不清楚如何在不创建第二个 Xcode 项目、第二个源代码控制分支或始终针对 Xcode 7 构建的情况下控制框架链接(我还不想做这些)。

macos xcode objective-c

5
推荐指数
1
解决办法
1244
查看次数

如何有效地将图像数据从XPC服务移动到主应用程序

TL/DR:在XPC服务中解码图像的最有效方法是什么,将数据移动到主应用程序然后显示它?

在几个处理macOS上的XPC服务的WWDC视频中,作为使用XPC服务的良好候选者的一个例子是图像和视频的解码.我有一个应用程序,它做了很多图像解码,我想进入XPC服务,但我想更好地了解如何有效地将解码图像数据从XPC服务移动到主应用程序.在处理图像时可以使用许多API,而且我不清楚在XPC服务中使用哪种API是最有效的(和高性能的).

图像阅读:

  • 使用Apple的Image I/O框架和 CGImage
  • 使用核心图像和 CIImage
  • 使用第三方库 OpenImage IO

所有这三个API都可以采用文件路径并返回"图像数据".Apple的API倾向于进行"延迟解码",只在需要绘制图像时解压缩图像数据.第三方库往往只返回一个解码数据的缓冲区,然后可以CGImage在以后用它包装.

当你使用苹果的API在XPC服务进行解码的图像,你需要一种方式来获得结果返回到主应用程序既不CGImageCIImage可以在一个XPC连接进行本地传输.但是,Apple确实提供了两个API,用于通过XPC连接有效地传输通用数据:

  • IOSurface
  • dispatch_data

但是,使用其中任何一个都需要XPC服务完全解压缩映像.在CGImage需要被渲染为位图上下文或数据的消费者,而CIImage需要使用被渲染到目的地CIContext.这样做是否会否定在主应用程序中进行拆包时本来可以实现的任何好处?

(请注意,每个渲染图像的最终目标都是contentsa 的属性CALayer.)

使用a IOSurface而不是dispatch_data对象似乎是更好的解决方案,因为IOSurface可以使用(显然)作为contentsa CALayer.CIContext有一个用于渲染的API IOSurface,但CGImage / CGImageDestination没有.

(有一种迂回的使用方法,vImage从a CGImage到a CVPixelBuffer再到a IOSurface,但看起来......错了吗?)

当我想要做的就是显示每个图像的缩略图时,使用Core Image对我来说似乎有些过分.Image IO提供CGImageSourceCreateThumbnailAtIndex了完美的功能,并且运行良好.(特别是在RAW文件中,它将使用嵌入的JPEG缩略图,如果存在,而Core Image将解码RAW内容.)

最后,金属在哪里适合所有这些?通过在XPC服务中渲染到金属纹理然后​​发送它来获取任何东西吗?

通过使用XPC服务,我如何影响Image IO或Core Image在适当的时候有效使用GPU的能力?如何最小化复制的数据量(在进程之间以及CPU和GPU之间)?这些缩略图在滚动网格视图中呈现,因此性能优先.

macos cocoa xpc objective-c appkit

5
推荐指数
0
解决办法
223
查看次数

如何将Metal Performance Shader与MTLBlitCommandEncoder同步?

我正在尝试更好地了解与Metal Performance Shaders和一起使用时的同步要求MTLBlitCommandEncoder

我有一个MTLCommandBuffer设置如下:

  • 使用MTLBlitCommandEncoder到纹理A的区域复制到纹理B. 纹理A比纹理B.大我提取纹理特征的一个“瓦”,并复制成质地B.

  • 使用MPSImageBilinearScale金属性能着色器,将纹理B作为源纹理,将第三纹理纹理C作为目标。此金属性能着色器将缩放并可能将纹理B的内容转换为纹理C。

在金属性能着色器开始尝试缩放纹理B之前,如何确保blit编码器完全完成了从纹理A到纹理B的数据复制?我什至不必担心这个问题,还是命令缓冲区的串行特性已经为我解决了这个问题?

Metal具有MTLFence用于同步访问资源的围栅的概念,但是我仍然看不到要在围栅上等待Metal Performance Shader。(而waitForFence:编码器上有。)

如果我不能使用篱笆并且需要同步,建议的做法是仅使blit编码器入队,然后waitUntilCompleted在使着色器入队并再次调用之前调用命令缓冲区waitUntilCompleted吗?例如:

id<MTLCommandBuffer> commandBuffer;

// Enqueue blit encoder to copy Texture A -> Texture B
id<MTLBlitCommandEncoder> blitEncoder = [commandBuffer blitCommandEncoder];
[blitEncoder copyFromTexture:...];
[blitEncoder endEncoding];

// Wait for blit encoder to complete.
[commandBuffer commit];
[commandBuffer waitUntilCompleted];

// Scale Texture B -> Texture C
MPSImageBilinearScale *imageScaleShader = [[MPSImageBilinearScale alloc] initWithDevice:...];  
[imageScaleShader encodeToCommandBuffer:commandBuffer...];

// Wait …
Run Code Online (Sandbox Code Playgroud)

macos objective-c metal metalkit metal-performance-shaders

5
推荐指数
1
解决办法
735
查看次数

如何检测 MTKView 中鼠标按下事件发生的位置?

这可能更像是一个通用的图形编程问题,但目前这是在 macOS 上使用 Apple Metal 框架的背景下。

在 中NSView mouseDown,只需调用以下命令即可轻松获取鼠标按下事件发生位置的本地坐标:

NSPoint localPoint = [self convertPoint:event.locationInWindow fromView:nil];

给定该本地点,需要采取哪些步骤来确定在渲染场景的上下文中鼠标按下发生的位置?

现在,我只是在MTKView. 2D 平面可以在 z 轴上缩放、平移和旋转。我可以稍微暴力地解决这个问题,因为场景非常简单,但我想知道更正确的方法是什么。

感觉好像我必须在 Objective-C 代码中复制一些顶点着色器逻辑,以确保正确应用所有转换。但我不太确定应用旋转时这个世界是如何运作的。

很少有 Metal 教程或参考文献详细讨论鼠标输入以及坐标系如何交互。任何见解将不胜感激。

在此示例中,如果用户单击橙色平面,如何确定该特定对象内的标准化坐标?(在此示例中,它可能类似于 [0.8, 0.9])

MTK查看图

macos objective-c metal metalkit

5
推荐指数
1
解决办法
1001
查看次数

解释Metal和SIMD中的不同类型

在使用Metal时,我发现类型令人困惑,而且我并不总是清楚在哪种情况下应该使用哪种类型。

在Apple的Metal Shading语言规范中,Metal着色器文件中支持哪种类型的表非常清楚。但是,有许多示例代码似乎使用了SIMD一部分中的其他类型。在macOS(Objective-C)方面,Metal类型不可用,但SIMD类型可用,我不确定应该使用哪种类型。

例如:

在《金属规格》中,float2它被描述为代表两个浮动成分的“向量”数据类型。

在应用程序方面,以下所有功能似乎都得到了使用或表示:

  • float2typedef ::simd_float2 float2位于vector_types.h中

    注意:“在C或Objective-C中,此类型可以作为simd_float2使用。”


  • vector_float2,这是 typedef simd_float2 vector_float2

    注意:“此类型已弃用;您应该改用simd_float2或simd :: float2”


  • simd_float2,这是 typedef __attribute__((__ext_vector_type__(2))) float simd_float2

  • ::simd_float2simd::float2

矩阵类型也存在类似情况:

  • matrix_float4x4simd_float4x4::simd_float4x4float4x4

有人可以说明为什么这么多的typedef具有看似重叠的功能吗?如果您今天(2018年)使用Objective-C / Objective-C ++编写一个新应用程序,则应使用哪种类型来表示两个浮点值(x / y),以及可以在应用程序代码和Metal之间共享的矩阵转换的类型?

macos cocoa objective-c simd metal

4
推荐指数
1
解决办法
1218
查看次数

如何在 XPC 服务中提供 Swift 类?

我正在尝试将 Apple 的 XPC“lowerCase”示例代码从 Objective-C 重建为 Swift。我了解 XPC 会,但我对 Swift 和 Objective-C 互操作性还比较陌生。

当我使用他们的确切示例代码(将 aString从应用程序传递到目标并返回)时,它可以工作。但是当我尝试用我自己的自定义类替换它时,Person我收到错误:

NSXPCConnection:...来自 pid 4133 的匿名侦听器或服务侦听器的连接:

在解码接收到的选择器 upperCasePerson:withReply: 期间捕获异常,丢弃传入消息。

异常:解码参数 0 时出现异常(调用的#2):

异常:decodeObjectForKey:类“CombineCycle.Person”未加载或不存在。

(演示应用程序名称为“CombineCycle”)

Person是一个 Swift 类,继承NSObject并遵循NSSecureCoding. 它有一个单一的属性name:String。它附带的.swift源文件包含在 XPC 目标的构建中。

该异常似乎是不言自明的,但我不确定需要更改哪些构建设置,或者需要生成哪些文件,以解决根本问题。

这只是一个演示应用程序。主应用程序是作为 Swift 应用程序创建的,不包含 Objective-C 文件。XPC 目标是使用 Xcode 的新目标功能创建的,该功能在 Xcode 11 中生成 Objective-C 框架。我用 Swift 实现替换了所有这些文件。

// Person.swift (Included in both targets)

@objc public class Person : NSObject, NSSecureCoding  {
  var name:String?

  init(_ name:String) …
Run Code Online (Sandbox Code Playgroud)

macos xpc objective-c nsxpcconnection swift

4
推荐指数
1
解决办法
1916
查看次数

macOS 下如何模拟内存不足的情况?

在开发和调试 macOS 应用程序时,有没有办法模拟系统范围内的“内存不足”事件或通知?

iOS 模拟器有这样的功能,但我似乎无法找出 macOS 下的等效项。

我感兴趣的是模拟内存不足的情况,看看班怎么样NSPurgeableDataIOSurface手柄被清除。

(除了编写一个不断分配内存的简单应用程序......)

macos xcode cocoa memory-management appkit

3
推荐指数
1
解决办法
777
查看次数

你能将 Swift 泛型约束限制为一组已知类型吗?

struct给定一个带有通用约束的基本 Swift,如下所示:

struct MetadataValue<T> {
  var value:T

  init(_ value:T) {
    self.value = value
  }
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以限制T它只能是某种允许类型中的一种吗?前任:

struct MetadataValue<T> where T:Double or T:Bool or T:String {
  ... 
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用组合来“和”约束,但是我可以以某种方式“或”约束吗?

目标:

用例场景是我能够存储图像和视频等元数据属性及其相应的值。我跟踪数百个不同的属性,但每个属性的值都是已知类型:如 String、Integer 或 Double,但显然不能是泛型T可能意外接受的任意类型。

generics macos swift

3
推荐指数
1
解决办法
1297
查看次数