3

課題ごとにカスタム課題オブジェクトを使用する宿題アプリに取り組んでいます。NSMutableArray (initWithArray 経由で NSArray にキャスト) を standardUserDefaults に保存しようとしていますが、配列の保存と再読み込みに問題があります。

新しい割り当てを追加するために選択できるテーブル ビューがあります (NewAssignmentViewController をロードします)。割り当てを保存すると、AssigmentsViewController の配列にプッシュされます。そして、割り当てを表示する UITableView をロードするたびに呼び出します。

関連するコードは次のとおりです。

-(void)saveToUserDefaults:(NSArray*)myArray{
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

if (standardUserDefaults) {
    [standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"Assignments"];
    [standardUserDefaults synchronize];
    }
}

-(void)retrieveFromUserDefaults{
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"Assignments"]; 
if (dataRepresentingSavedArray != nil) {
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if ([oldSavedArray count] != 0) {
        [assignments setArray:[[NSMutableArray alloc] initWithArray:oldSavedArray]];
    }
    else {
        assignments = [[NSMutableArray alloc] initWithCapacity:100];
    }
}
}
 -(void)backButtonPressed {
[self saveToUserDefaults:[[NSArray alloc] initWithArray:assignments]];
[self.navigationController popViewControllerAnimated:YES];
}

助けてください。配列はロードされませんが、エラーは発生しません。UserDefault または KeyedArchiver に関する一般的なヒントをいただければ幸いです。

4

2 に答える 2

2

ここにいくつかのことがあります:

私があなたを正しく理解していれば、内容が代入オブジェクトである配列を保存しようとしています。

これらのオブジェクトを NSUserDefaults に保存するためにシリアル化する場合は、Assignment オブジェクト自体が、これらのメソッドをオーバーライドして NSCoding プロトコルに準拠する必要があります。

- (void)encodeWithCoder:(NSCoder *)encoder;
- (id)initWithCoder:(NSCoder *)decoder;

Assignment オブジェクトのコードを投稿していないため、これを適切に行ったかどうかはわかりません。持っている場合は、オブジェクトをエンコードできるはずです。詳細については、アーカイブおよびシリアライゼーション プログラミング ガイドを参照してください。

NSUserDefaults に関しては、私の読みでは、基本的にアプリケーションのオブジェクト モデルをそこに格納しようとしています。最高のアイデアではありません。NSUserDefaults は、軽量の永続データ (基本設定、文字列、ユニバーサル データのスクラップ) での使用に最適です。

私がすることは、アーカイブされたデータをファイルに書き出し、ビューが読み込まれるときにそれを読み込むことです。

そのテーマに関するBeginning iPhone Developmentのコードを次に示します。

NSCoding に準拠したオブジェクトからアーカイブを作成するのは比較的簡単です。まず、NSMutableData のインスタンスを作成してエンコードされたデータを保持し、次に NSKeyedArchiver インスタンスを作成してオブジェクトをその NSMutableData インスタンスにアーカイブします。

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

これらの両方を作成した後、次のようにキー値コーディングを使用して、アーカイブに含めたいオブジェクトをアーカイブします。

[archiver encodeObject:myObject forKey:@”keyValueString”];

含めるすべてのオブジェクトをエンコードしたら、アーカイバに完了を伝え、NSMutableData インスタンスをファイル システムに書き込み、オブジェクトのメモリ クリーンアップを行います。

[archiver finishEncoding]; BOOL success = [data writeToFile:@”/path/to/archive” atomically:YES]; 
[archiver release]; 
[data release];

アーカイブからオブジェクトを再構成するには、同様のプロセスを経ます。アーカイブ ファイルから NSData インスタンスを作成し、NSKeyedUnarchiver を作成してデータをデコードします。NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; その後、オブジェクトのアーカイブに使用したのと同じキーを使用して、アンアーカイバーからオブジェクトを読み取ります。

self.object = [unarchiver decodeObjectForKey:@”keyValueString”];

また、ファイルを保存およびロードするには、アプリケーションのドキュメント ディレクトリを取得する必要があります。

これは非常に有用な本であり、コード スニペットがたくさんあります。持続性に関する章が役に立つかもしれません。考えてみれば、このタスクに Core Data を使用する方がずっと幸せかもしれません。

于 2009-12-11T10:18:50.367 に答える
0

これで問題が解決するかどうかはわかりませんが、配列をデフォルトから NSData として引き出す必要はありません。NSUserDefaults リファレンスを確認すると、配列が有効なデフォルト オブジェクトであることがわかります。

于 2009-12-10T19:25:02.697 に答える