1

私のアプリケーションは、製品のカタログを表示するように設計されています。サーバーから受信したすべてのデータ (xml) は、NSDictionary で解析されます。したがって、NSDictionary には約 5000 の項目が含まれています。NSKeyedUnarchiver を使用して辞書を読み取るには、24 秒かかります。それは容認できません。

アプリの更新後にカタログが再度ダウンロードされ、古いデータが削除されるため、前方互換性と後方互換性は必要ありません。

私の辞書はプロパティ リストではないため、writeToFile は機能しません。

NSArchiever(NSUarchiver) はこの問題に対する優れたソリューションですが、NSKeyedArchiver に置き換えられました。

何か案は?CoreData を使用する必要があるかもしれませんが、それについては何も知りません。

ありがとう

4

2 に答える 2

0

JSON形式のファイルとして保存しようとしましたか?NSJSONSerialization は、ファイル データと NSDictionary の間を行き来するのに役立ちます。iOS5で追加されました。

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html

それがあなたにとって十分に機能するかどうか教えてください。

于 2013-09-05T15:08:34.323 に答える
-1

私の解決策は、カスタムのシリアル化を使用することです。最後に、すべてのデータがプロパティ リストとして表示されます。シリアル化する必要があるすべてのカスタム クラスは、プロトコル PropertyListCoder (NSCoder など) をサポートします。

@protocol PropertyListCoder

- (id)encodeToPropertyListObject;
- (id)initWithPropertyListObject:(id)object;

@end

たとえば、クラス Product のシリアル化:

@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 秒かかります!

于 2013-09-15T19:33:40.563 に答える