2012-04-22 10 views
1

filePathからロードしているNSDataがあります。データは次に渡され、データがどこから来たのかfilePathが必要です。NSDataのファイルパス

filePathを余分なパラメータとして渡すのが簡単でないのはどうでしょうか?

答えて

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 
2

必要なデータを含む別の構造体またはクラスを作成する必要がありますが、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を返します。 。

これは、既存のクラスにビヘイビアを追加する必要がある場合(もちろん、カテゴリを最適に使用するための適切な方法に従う)、一般的なソリューションです。

+1

これは有効な方法ですが、新しく関連付けられたオブジェクトランタイムコールをうまく使用することができますが、本当に必要なときにのみ行うべきだと思います。特に優雅ではありません。 @joerickによって提案されたような単純なコンテナクラスは、ここでより適切です。モデルオブジェクトをカプセル化するより良い方法であり、よりメンテナンス可能なコードを作成します。 –

+0

@RobKeniger:よく言った。 – user523234