来自NSData的文件路径

时间:2012-04-22 22:19:18

标签: ios cocoa nsdata

我有NSData,我从filePath加载。然后传递数据,我需要filePath来获取数据的来源。

除了将filePath作为额外参数传递之外,最简单的方法是什么?

2 个答案:

答案 0 :(得分:5)

将两者都包装在代表文件的容器对象中,例如

@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

答案 1 :(得分:2)

虽然您应该创建一个包含所需数据的单独结构或类,但您也可以向NSData添加关联。

为方便起见,您甚至可以将其作为NSData上的类别进行...假设您正在使用字符串...如果使用URL,则使用NSURL ...这样,您的其他代码都不需要更改...您仍然可以像以前一样使用新添加的属性。

注意:使用或不使用类别的原因有很多。我假设您将为您的代码情况做出最佳选择,并将战争推迟到其他人的好/坏使用。

尝试这样的事情......

的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。

这是您需要向现有类添加行为的一般解决方案(当然,遵循何时最佳使用类别的适当做法)。

相关问题