0

で奇妙な問題が発生しましたNSArray。アプリは、異なる入力で 2 つのシナリオで同じ Web サービスをヒットする必要があります。1 つは初期状態で、サーバーからの応答がNSUserDefaultsの助けを借りて に保存されますNSKeyedArchiver。次は特定のアクションの完了時で、応答に基づいて格納された値NSUserDefaultsが変更されます。

NSArray *sorted = [ActiveOrder arrayOfModelsFromDictionaries: [responseObject objectForKey:@"GetActiveOrdersResult"]]; //ActiveOrder is a custom JSON model object
NSSortDescriptor *orderCreateDate = [[NSSortDescriptor alloc] initWithKey:@"orderCreateDate" ascending:YES];
ordersList = [[NSMutableArray alloc] initWithArray: [sorted sortedArrayUsingDescriptors: [NSArray arrayWithObjects:orderCreateDate, nil]]];

NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:ordersList.count];
for (ActiveOrder *itemDetail in ordersList) {
    [archiveArray addObject:itemDetail];
} //if i log 'archiveArray' it prints valid value (array of 'ActiveOrder' objects)

NSData *itemDetailObject = [NSKeyedArchiver archivedDataWithRootObject:archiveArray];
[[NSUserDefaults standardUserDefaults] setObject:itemDetailObject
                 forKey:TAG_ACTIVE_ORDERS_RESPONSE];

以前に保存したデータを解凍しようとすると、6 つの ActiveOrder オブジェクトではなく@"6 objects"が出力されます。

NSMutableArray *itemsFromLastResult = [[NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: TAG_ACTIVE_ORDERS_RESPONSE]] mutableCopy];

上記の行を使用して、保存された値にアクセスして変更しています。実際のオブジェクトの代わりに @"6 objects" を出力している理由がとてもわかりません。そして、ランダムにクラッシュしています(これが理由であると推測しています)。私が間違っていることはありますかNSKeyedArchiver/NSKeyedUnarchiver

解決策を知っておいてよかったです。ありがとう!

4

1 に答える 1

0

NSUserDefaults はオブジェクトを非同期に保存します! [[NSUserDefaults standardUserDefaults] 同期] を試してください。setObjectForKey の後

于 2015-05-13T12:47:49.520 に答える