方法 Swizzle encodeWithCoder/initWithCoder

Posted

技术标签:

【中文标题】方法 Swizzle encodeWithCoder/initWithCoder【英文标题】:Method Swizzle encodeWithCoder/initWithCoder 【发布时间】:2012-05-24 09:00:38 【问题描述】:

我们正在开发一款可以将大量内容保存到 Core Data 的应用。它保存的东西主要是NSDateNSNumberNSString,但它也将许多图像和视频保存为NSData。我正在尝试更改它,以便将这些文件保存到本地存储中,并将文件名保存在核心数据中,然后我们只需从本地存储中加载它,希望在访问核心数据时节省时间并使其成为稳定一点。

在讨论之后,我们认为重写 encodeWithCoder 和 initWithCoder 是最简单的,这样我们就可以拦截调用来保存数据并将它们保存在文件系统上。然后我发现 NSData 实际上是类集群的一部分,因此覆盖函数比看起来更难。

然后我读到了方法调配,您可以将一种实现换成另一种。我四处搜索并找到this,并在 Stack Overflow 上找到一篇帖子说要使用那篇文章,但它并没有真正帮助我,而且我仍然不知道如何做我需要的事情。

谁能给我指出正确的方向,或者给我一些他们自己的建议,告诉我该怎么做?

谢谢,

【问题讨论】:

【参考方案1】:

不要混搭这些——相信我 :)

如果您想按描述保存,请将该实现放在您的类的归档方法实现中(不是子类,不是 swizzle,而是包含这些对象的类)。

【讨论】:

所以只是一个包含处理保存的 NSData 的包装器?我考虑过这一点,但希望有一个更优雅的解决方案。无论如何,谢谢。 @Luke 有点。我指的是图像、电影等的 container 类 - 不是纯粹的基础类型包装器。 我不太确定你的意思。所以创建我自己的数组来存储所有NSDatas?问题是它们被存储在许多核心数据实体文件中。有没有更简单的方法可以将我的功能添加到 encodeWithCoder 等? @Luke 我将容器称为代表这些资产/实例的对象,例如:@interface MONMediaContainer : LEBaseClass < NSCoding > @property (blah) NSData * data; @property (blah) NSNumber * number; @property (blah) NSString * string; @end @implementation MONMediaContainer - (void)encodeWithCoder:(NSCoder *)pCoder // write members to disk // save the location in pCoder

以上是关于方法 Swizzle encodeWithCoder/initWithCoder的主要内容,如果未能解决你的问题,请参考以下文章

swizzle method 和消息转发机制的实际使用

6.5 Swizzle 操作符

Swift3.0 - 黑魔法swizzle

iOS - EncodeWithCoder - 编码无

圆角优化

Swift 3 Xcode 8 - SwiftValue encodeWithCoder - 发送到实例的无法识别的选择器