发布于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 long
s的应当变为II
表示两个unsigned int
s的
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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!