首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在读取NSData/CFData对象时获取通知吗?

在读取NSData/CFData对象时获取通知吗?
EN

Stack Overflow用户
提问于 2016-06-04 23:10:42
回答 3查看 132关注 0票数 1

我使用的是一个接受CFData对象的API,我需要动态生成数据,这是一个耗时的操作。CFData是由使用者以一种随机的、非连续的方式读取的,它实际上很少需要整个数据的长度--它只需要某些随机的数据片段。

我只想通过实际生成用户所请求的比特来提高性能,因为它们是被请求的。

是否有任何方法可以子类CFData/NSData,以便在读取数据块并动态生成数据块时得到回调?

更新:不幸的是,使用者是第三方代码,所以其他类不是一个选项,除非它们神奇地与CFData兼容。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-21 19:00:40

我觉得你不会喜欢你在这里得到的答案。你似乎在选择上走投无路。

我们知道你的情况

  1. 客户端代码不能接受不同的类型/类
  2. CFData是CoreFoundation C-类型,没有运行时可玩
  3. 客户端可能使用CoreFoundation符号来读取此数据。
    1. 如果幸运的话,它是通过Obj中的Foundation API实现的,它有一个运行时

  4. CFData将一个void *封装到数据中,但是在开始时有一些填充(可能是一个结构),如果您试图创建一个CFData代理对象,就很难模仿它。

如果没有一些聪明的、不可维护的、总体上危险的符号黑客行为,我甚至不会费心去进入,就很难完成你想要的东西。

票数 0
EN

Stack Overflow用户

发布于 2016-06-04 23:15:30

也许你想要的更像NSInputStream

NSInputStream是NSStream的子类,它提供只读流功能。 NSInputStream是“免费搭桥”与其核心基金对应,CFReadStreamRef。有关免费桥接的更多信息,请参见免费桥接。 子类注释 NSInputStream是由NSStream的具体子类组成的类集群的抽象超类,这些子类提供对流数据的标准只读访问。虽然对于大多数需要访问流数据的情况,NSInputStream可能已经足够了,但是如果您想要更专门的行为(例如,您希望在流中记录数据的统计信息),可以创建NSInputStream的子类。

票数 0
EN

Stack Overflow用户

发布于 2016-09-21 19:35:09

CFDataRefNSData是免费的桥梁。这意味着,您可以将NSData实例传递到期望CFData的代码中。

NSData是一个类集群。这意味着,您可以将其子类化,并且只实现原始方法和初始化器。对于NSData原语方法,如下所示:

代码语言:javascript
复制
@property (readonly) NSUInteger length;
@property (readonly) const void *bytes NS_RETURNS_INNER_POINTER;

您还必须实现一些init..。方法,它将初始化实例。

所有其他NSData功能都是按类别提供的。您仍然可以覆盖任何方法并提供自己的实现。

作为一个选项,您可以从NSData子类开始,该子类将将任何方法委托给内部NSData实例,您可以将该实例存储在属性中。通过这种方式,您可以观察第三方代码行为,并研究需要覆盖哪些方法。

不过,你需要很多运气才能实现你想要的。但这可能是可能的。

例如,我创建了以下虚拟NSData子类:

代码语言:javascript
复制
@interface MyData : NSData
@property (nonatomic, strong) NSData *innerData;
@end

@implementation MyData

- (id)initWithData:(NSData *)data {
    if (self = [super init]) {
        _innerData = data;
    }
    return self;
}

- (NSUInteger)length {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    return self.innerData.length;
}

- (const void *)bytes {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    return self.innerData.bytes;
}

@end

当我调用以下代码时:

代码语言:javascript
复制
NSData *originalData = [NSData dataWithBytes:"hello" length:5];
MyData *myData = [[MyData alloc] initWithData:originalData];
NSLog(@"%ld", CFDataGetLength((CFDataRef)myData));

调用我的子类的length方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37635892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档