Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa PyObjC和自定义块_Cocoa_Macos_Pyobjc - Fatal编程技术网

Cocoa PyObjC和自定义块

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):

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

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

示例

@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)