2012-04-22 30 views
1

我有我從文件路徑加載的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所建議的,在這裏更合適,是封裝模型對象的更好方法,並且可以提供更易維護的代碼。 – 2012-04-22 23:01:01

+0

@RobKeniger:好吧。 – user523234 2012-04-22 23:22:21