我有从文件路径加载的 NSData。然后数据被传递,我需要数据来自哪里的文件路径。
除了将 filePath 作为额外参数传递之外,最简单的方法是什么?
将两者包装在代表文件的容器对象中,例如
@interface File : NSObject
@property (strong) NSData *fileContents;
@property (copy) NSString *filePath;
// perhaps, even a nice constructor to fill these properties
- (id)initWithFilePath:(NSString *)filePath;
@end
虽然您可能应该创建一个包含所需数据的单独结构或类,但您也可以向 NSData 添加关联。
为方便起见,您甚至可以将其作为 NSData 上的一个类别...假设您使用的是字符串...如果使用 URL,请使用 NSURL...这样,您的其他代码都不需要更改...您仍然可以像以前一样使用您的 NSData ,并使用新添加的属性。
注意:使用或不使用类别的原因有很多。我假设你会根据你的代码情况做出最好的选择,并将关于类别的好/坏使用的战争推迟到其他人身上。
尝试这样的事情......
NSData+AssociatedFilePath.h
#import <Foundation/Foundation.h>
@interface NSData (AssociatedFilePath)
@property (nonatomic, strong) NSString *filePath;
@end
NSData+AssociatedFilePath.m
#import <objc/runtime.h>
static char kFilePath;
@implementation NSData (AssociatedFilePath)
- (void)setFilePath:(NSString*)filePath
{
objc_setAssociatedObject(self, &kFilePath, filePath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString*)filePath
{
return objc_getAssociatedObject(self, &kFilePath);
}
@end
现在,在您的代码中,您可以执行此操作...
NSData *data = // whatever you do to create the data object..
data.filePath = someFilePath;
每当您想要 NSData 对象的文件路径时...
NSString *filePath = myNSDataObject.filePath;
由于它是一个类别,因此您可以在任何 NSData 对象上使用它,如果从未设置过文件路径,它将只返回 nil。
这是您需要向现有类添加行为的任何时候的通用解决方案(当然,在最佳使用类别时遵循适当的做法)。