程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

带有范围的pyobjc索引访问器方法

发布于2020-02-16 18:44     阅读(727)     评论(0)     点赞(4)     收藏(1)


按照KVC guide,我正在尝试为我的模型类在Python中实现索引访问器方法由于性能原因,我想使用可选的远程方法来一次加载多个对象。该方法采用一个指向C数组缓冲区的指针,我的方法需要将该对象复制到C数组缓冲区中。我已经尝试过类似以下的方法,但无法正常工作。我该如何完成?

@objc.accessor    # i've also tried @objc.signature('v@:o^@')
def getFoos_range_(self, range):
    return self._some_array[range.location:range.location + range.length]

编辑苹果移动了所有文档之后,我终于找到了类型编码参考看完之后,我尝试了一下:

@objc.signature('v@:N^@@')
def getFoos_range_(self, buf, range):

但这似乎也不起作用。第一个参数应该是指向C数组的指针,但是长度直到运行时才是未知的,所以我不确切地知道如何构造正确的类型编码。'v@:N^[1000@]@'只是想看看,那也不起作用。

我的模型对象绑定到驱动表视图的NSArrayController的contentArray上。它似乎根本没有调用此方法,可能是因为它期望的签名与桥提供的签名不同。有什么建议么?


解决方案


你近了 此方法的正确装饰器是:

@objc.signature('v@:o^@{_NSRange=QQ}')

NSRange不是对象,而是结构,不能简单地指定为@;。您需要包括成员1

不幸的是,这还没有结束。经过大量的实验和对PyObjC源代码的研究,我终于弄清楚了,为了使此方法起作用,您需要为该签名指定多余的元数据。(但是,我仍然不知道为什么。)

这是通过使用以下功能完成的objc.registerMetaDataForSelector

objc.registerMetaDataForSelector(b"SUPERCLASSNAME", 
                                 b"getKey:range:",
        dict(retval=dict(type=objc._C_VOID),
             arguments={ 
                  2+0:  dict(type_modifier=objc._C_OUT,
                             c_array_length_in_arg=2+1),
                  2+1:  dict(type=b'{_NSRange=II}',
                             type64=b'{_NSRange=QQ}')
             }
        )
)

可以在PyObjC源代码的文件test_metadata_py.py(和附近的test_metadata*.py文件)中找到使用此功能的示例和一些详细信息

注意:元数据必须在您想要实现的任何类超类指定get<Key>:range:,而且该函数需要在类定义结束之前的某个时候调用(但class似乎语句本身之前或内部)工作)。我也没有弄明白这些内容。

我将此元数据基于NSArray getObjects:range:Foundation PyObjC.bridgesupport文件2中的元数据,并通过参考Apple的BridgeSupport联机帮助页

有了这个解决方案,还值得注意的是,定义该方法的最简单方法是(至少是IMO):

@objc.signature('v@:o^@{_NSRange=QQ}')
def get<#Key#>_range_(self, buf, inRange):
    #NSLog(u"get<#Key#>")
    return self.<#Key#>.getObjects_range_(buf, inRange)

即,使用数组的内置getObjects:range:


1:在32位Python上QQ,表示两个unsigned long longs的应当变为II表示两个unsigned ints的
2:位于(在Snow Leopard上)位于:/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python /PyObjC/Foundation/PyObjC.bridgesupport



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/231611/e8c60d99f70c232126f5/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

4 0
收藏该文
已收藏

评论内容:(最多支持255个字符)