gpt4 book ai didi

cocoa - PyObjC 和自定义 block

转载 作者:行者123 更新时间:2023-12-03 16:08:48 25 4
gpt4 key购买 nike

官方文档说可以在Python代码中使用自定义 block ,但需要创建元数据。我还没有找到这样的例子。

我的问题是如何创建、使用和分发自定义 block 的元数据。

示例

@interface SomeClass

- (void)doSomethingWithCompletion: (void (^)(SomeObject *obj, NSError *error))myBlock;

@end


def pythonMethod():
def completion(obj, error):
# staff
foo = SomeClass.new()
foo.doSomethingWithCompletion_(somehow_pass_completion)

问题是 somehow_pass_completion 应该是什么样子,以及如何为 myBlock 提供元数据。

最佳答案

所提到的元数据是以 XML 格式存储的有关 Objective-C 方法的返回类型和参数类型的信息。需要它,以便 PyObjC 桥知道将 Python 对象传递回 Objective-C 代码时将其转换为什么类型。如果您愿意,可以查看元数据;它位于 PyObjC 框架内的 .bridgesupport 文件中。例如,AppKit 元数据位于/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/AppKit/PyObjC.bridgesupport 它可以为您使用的任何 Objective-C 代码生成Apple 的 gen_bridge_metadata 命令行工具。有一个man page对于该实用程序,以及 man 5 BridgeSupport也提供了丰富的信息。1

PyObjC 提供了函数 objc.registerMetaDataForSelectorobjc.parseBridgeSupport,这两个函数都允许您使用 Python 字典(前一个函数)为您的方法添加元数据或 BridgeSupport 手册页中描述的 XML 格式(后者)。使用 registerMetaData... 的示例可在 pyobjc 源代码中找到:pyobjc/pyobjc-core/PyObjCTest/test_metadata* (以及附近的 test_metadata*.py 文件)2

举个例子,这是 -[NSSavePanel beginWithCompletionHandler:] 的元数据,它接受一个 block 作为参数:

<method selector='beginWithCompletionHandler:'>
<arg index='0' block='true' >
<retval type='v' />
<arg type='i' type64='q' />
</arg>
</method>

arg 类型说明符相同 Type Encodings在 Obj-C 中使用 @encode 得到的结果。您的方法的元数据应该非常相似。

因此,既然您的方法是在 Objective-C 中原型(prototype)化的,那么您应该能够通过 gen_bridge_metadata 运行它们来创建一个可以包含在项目中的 .bridgesupport 文件,然后使用 objc.parseBridgeSupport 读取该文件。过去使用 objc.registerMetaDataForSelector 也对我有用;查看上面链接的示例。

一旦您在 PyObjC“系统”中拥有元数据,您就可以使用任何旧的可调用对象作为采用 block 的方法的参数:

def pythonMethod():
def myCompletionHandler(obj, error):
pass
foo = SomeClass.new()
foo.doSomethingWithCompletion_(myCompletionHandler)

这是我在这里发表的有关 PyObjC 的其他几篇文章的综合体:PyObjC and Returning Out Parameters | Indexed Accessor Method | Problem with openPanelDidEnd 。您可能也想看看这些。

我已经有一段时间没有搞过这个了,所以我可能遗漏了一些东西。如果您仍然无法使其正常工作,请随时询问更多信息。不过,不要轻易放弃——这座桥是一头有趣的野兽,有时你只需要向它展示谁才是老大!

<小时/>

1您应该阅读的另一个 Apple 文档是:Generating Framework Metadata .
2我通过 pyobjc-dev mailing list thread 发现了这些

关于cocoa - PyObjC 和自定义 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5888278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com