我解決方案是使用自定義序列化。最後,所有數據都以屬性列表形式呈現。應序列化支持協議PropertyListCoder(如NSCoder)我所有的自定義類:
@protocol PropertyListCoder
- (id)encodeToPropertyListObject;
- (id)initWithPropertyListObject:(id)object;
@end
例如,序列化類產品:
@interface Product : NamedObject <NSCoding, PropertyListCoder> {
}
@property (nonatomic, readwrite) uint mId;
@property (nonatomic, retain) NSString *mDesc;
@property (nonatomic, retain) NSString *mIcon;
@property (nonatomic, retain) NSString *mCode;
@property (nonatomic, readwrite) uint mSort;
@property (nonatomic, retain) NSMutableArray *mArrOfText;
@property (nonatomic, readonly) NSMutableArray *mProperties;
@property (nonatomic, retain) NSString *mImage;
@property (nonatomic, readwrite) float mPrice;
@property (nonatomic, readwrite) float mDiscPrice;
@end
這裏是該協議的方法:
- (id)encodeToPropertyListObject {
id superPropList = [super encodeToPropertyListObject];
NSNumber* idNumber = [[NSNumber alloc] initWithInt:mId];
NSNumber* sortNumber = [[NSNumber alloc] initWithInt:mSort];
NSMutableArray* arrOfTextPropList = [[NSMutableArray alloc] init];
for (NSAttString* str in self.mArrOfText) {
[arrOfTextPropList addObject:[str encodeToPropertyListObject]];
}
NSMutableArray* propPropList = [[NSMutableArray alloc] init];
for (Property* prop in self.mProperties) {
[propPropList addObject:[prop encodeToPropertyListObject]];
}
NSNumber* priceNumber = [[NSNumber alloc] initWithInt:mPrice];
NSNumber* discPriceNumber = [[NSNumber alloc] initWithInt:mDiscPrice];
NSArray* res = [NSArray arrayWithObjects:superPropList, idNumber, [Utility notNilStringWithString:mDesc], [Utility notNilStringWithString:mIcon], [Utility notNilStringWithString:mCode], sortNumber, arrOfTextPropList, propPropList, [Utility notNilStringWithString:mImage], priceNumber, discPriceNumber, nil];
[idNumber release];
[sortNumber release];
[arrOfTextPropList release];
[propPropList release];
[priceNumber release];
[discPriceNumber release];
return res;
}
- (id)initWithPropertyListObject:(id)object {
NSArray* arr = (NSArray*)object;
self = [super initWithPropertyListObject:[arr objectAtIndex:0]];
if (self) {
mId = [[arr objectAtIndex:1] intValue];
mDesc = [[arr objectAtIndex:2] retain];
mIcon = [[arr objectAtIndex:3] retain];
mCode = [[arr objectAtIndex:4] retain];
mSort = [[arr objectAtIndex:5] intValue];
mArrOfText = [[NSMutableArray alloc] init];
mProperties = [[NSMutableArray alloc] init];
for (id subObj in (NSArray*)[arr objectAtIndex:6]) {
NSAttString* str = [[NSAttString alloc] initWithPropertyListObject:subObj];
[mArrOfText addObject:str];
[str release];
}
for (id subObj in (NSArray*)[arr objectAtIndex:7]) {
Property* prop = [[Property alloc] initWithPropertyListObject:subObj];
[mProperties addObject:prop];
[prop release];
}
mImage = [[arr objectAtIndex:8] retain];
mPrice = [[arr objectAtIndex:9] floatValue];
mDiscPrice = [[arr objectAtIndex:10] floatValue];
}
return self;
}
根對象可能是NSDictionary或NSArray。然後爲了讀/寫,我使用二進制格式的NSPropertyListSerialization。 現在閱讀詞典需要3.5秒!
你爲什麼不只是使用一個SQLite數據庫保存,多數民衆贊成在手機上? – heinst