Cocoa PyObjC和自定义块
官方文档说,可以在python代码中使用自定义块,但需要创建元数据。我还没有找到这样的例子 我的问题是如何为自定义块创建、使用和分发元数据 示例Cocoa PyObjC和自定义块,cocoa,macos,pyobjc,Cocoa,Macos,Pyobjc,官方文档说,可以在python代码中使用自定义块,但需要创建元数据。我还没有找到这样的例子 我的问题是如何为自定义块创建、使用和分发元数据 示例 @interface SomeClass - (void)doSomethingWithCompletion: (void (^)(SomeObject *obj, NSError *error))myBlock; @end def pythonMethod(): def completion(obj, error):
@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)
问题是
如何通过完成以及如何为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。它可以使用苹果的gen_bridge_元数据
命令行工具为任何Objective-C代码生成。该实用程序有一个简单的示例,并且信息丰富。1
PyObjC提供函数objc.registerMetaDataForSelector
和objc.parseBridgeSupport
,这两个函数都允许您使用Python dicts(前一个函数)或BridgeSupport手册页(后一个)中描述的XML格式为方法添加元数据。pyobjc源代码中提供了使用registerMetaData…
的示例:(及附近的test\u metadata*.py
文件)2
例如,这是的元数据,它将块作为参数:
<method selector='beginWithCompletionHandler:'>
<arg index='0' block='true' >
<retval type='v' />
<arg type='i' type64='q' />
</arg>
</method>
这是我在这里发表的关于PyObjC的其他几篇文章的混合体:| |。你可能也想看看这些
我已经有一段时间没有思考这个问题了,所以我可能遗漏了一些东西。如果你仍然无法实现这一点,请不要犹豫,询问更多信息。不过,不要轻易放弃——这座桥是一只有趣的野兽,有时你只需要让它知道谁是老板
1您应该阅读的另一份苹果文档是:。
2我是通过pyobjc开发人员发现这些的,你能举个例子说明你想要完成什么吗?如果我的例子没有说明问题,请告诉我。不,那太好了。我可能要到今天晚些时候才能得到答案,但我知道你需要做什么。好的,答案贴出来了!祝你好运
def pythonMethod():
def myCompletionHandler(obj, error):
pass
foo = SomeClass.new()
foo.doSomethingWithCompletion_(myCompletionHandler)