NSURLConnectionを使用してサーバーからXMLデータを取得しています。私は、データを解析し、それをテーブルビューで表示しています。それはすべて期待通りに機能します。今、オフラインで使用するためにダウンロードしたデータを保存したいと思います。アイデアはNSDataをダウンロードしてNSArrayに変換し、NSUserDefaultsまたは別のファイルに保存することでした。しかし、NSDataをNSArrayに変換する際に問題が発生しています。iPhoneでNSDataからNSArrayへのエラーが発生しました
ロジックを(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
メソッドに追加しました。次のように私は何をしようとしていることである:
エラー操作を完了できませんでした:次のようにログに
NSError *error; NSPropertyListFormat plistFormat; id object = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:&plistFormat error:&error]; if (error != nil) { NSLog(@"Error %@", [error localizedDescription]); [error release]; } if ([object isKindOfClass:[NSArray class]]) { NSLog(@"IS Array"); NSArray *objectArray = object; [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"myKey"]; } else { NSLog(@"Not an array"); }
は私が得ます。 (ココアエラー3840)
ない 配列
私はエラー処理を削除し、
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];
私のアプリケーションがクラッシュし、次のメッセージでちょうどラインを残す場合: `
キャッチされていない例外のためアプリを終了します 'NSInvalidArgumentException'、理由: '*** - [NSKeyedUnarchiver initForReadingWithData:]:不可解なアーカイブ(0x3cの、0x3fを、0x78と、 0x6d、0x6c、0x20に、0x76、0x65)」
なぜこの出来事はありますか? Cocoaエラー3840とは何ですか?
オブジェクトはNSCodingプロトコルを実装しており、メソッドはencodeWithCoder
とinitWithCoder
です。オブジェクトのすべてのプロパティをエンコード/デコードする必要がありますか?
編集:ここではは私の物である:
Currency.h
@interface Currency : NSObject<NSCoding>{
CGFloat value;
NSString *code;
NSDate *date;
NSString *description;
NSString *imagePath;
}
@property (nonatomic, assign) CGFloat value;
@property (nonatomic, retain) NSString *code;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSString *description;
@property (nonatomic, retain) NSString *imagePath;
Currency.m
@implementation Currency
@synthesize value;
@synthesize code;
@synthesize date;
@synthesize description;
@synthesize imagePath;
static NSString * const keyCode = @"code";
static NSString * const keyDescription = @"description";
static NSString * const keyValue = @"value";
- (void)dealloc {
[code release];
[date release];
[description release];
[imagePath release];
[super dealloc];
}
- (void)encodeWithCoder:(NSCoder *)coder
{
if ([coder allowsKeyedCoding]) {
[coder encodeObject:code forKey: keyCode];
[coder encodeObject:description forKey: keyDescription];
[coder encodeFloat:value forKey: keyValue];
}
}
}
- (id)initWithCoder:(NSCoder *) coder {
self = [[Currency alloc] init];
if (self != nil)
{
code = [[coder decodeObjectForKey:keyCode] retain];
description = [[coder decodeObjectForKey:keyDescription] retain];
value = [coder decodeFloatForKey:keyValue];
}
return self;
}
@end
データとは何ですか? NSCoding実装の実装を投稿します。 – logancautrell