2011-12-04 21 views
1

私は、サーバーからいくつかのJSONデータを取得し、サブアレイとサブディクショナリを含む辞書の配列に解析するiPhoneアプリケーションを持っています。NSDictionaryのNSArrayをディープコピーする方法は?

今私はfilteredTimetableをループし、不要なオブジェクトを取り除く前にfilteredTimetableにコピーして、timeTableのivarに保存しました。

私が抱えている問題は、再度フィルタリングできるようにアレイを復元しようとするときです。コピーされたNSArrayから前に削除されたオブジェクトは元のNSArrayからも削除されます。

filteredTimeTable = [[NSMutableArray alloc] initWithArray:timeTable copyItems:YES]; 

私はfilteredTimeTableは単にtimeTable内のオブジェクトへのポインタを保存するのではなくメモリにコピーしているためであると仮定します。ここで

は私のデータ構造の一例である:

[ 
     {"time":"09:00", 
     "events": [ 
      { "module":"COMP319", "type":"lecture", "room":"BROD-108:80" } 
      { "module":"COMP320", "type":"lab", "room":"BROD-LT" } 
     ]}, 

私はもはや私が要素を復元することはできません必要とされたモジュールを削除します。

これで、すべてのサブオブジェクトを含めて完全コピーを行うことはできますか?

答えて

2

オリジナルのJSON文字列をそのまま残しておき、再解析することができます。

何らかの理由でそれをしたくない場合や、すべての有効なプロパティリストオブジェクト(NSArray、NSDictionary、NSString、NSNumber、NSDate、NSData)の場合は、最も簡単な方法はプロパティリストのシリアル化を使用することです。

NSData *archive = [NSPropertyListSerialization dataWithPropertyList:originalObject format:NSPropertyListBinaryFormat_v1_0 options:0 error:NULL]; 
NSMutableArray *copiedObject = [NSPropertyListSerialization propertyListWithData:archive options:NSPropertyListMutableContainers format:NULL error:NULL]; 
+0

私は最初のオプションを使いました。私は2番目を試みたが、私のアプリケーションはクラッシュした。 – Ash

1

あなたの辞書が表すもののモデルオブジェクトを作成することをお勧めします。あなたのクラスが辞書からオブジェクトを作成できるようにし、オブジェクトを正しくコピーすることができるようにします。あなたはタイムテーブル、イベント、またはその両方のためにこれを行うことができます。 initWithArray:copyItems:を使用して、時間表またはイベントの配列をコピーできます。

辞書の代わりに実際のモデルオブジェクトを使用すると、コードがきれいになります。

は、今のところ私はこのfilteredTimetableをループして、私は必要のないオブジェクトを削除する前filteredTimetableにコピーtimeTablethen IVARに保存されています。

コアデータを使用してモデルオブジェクトオブジェクトに管理されている場合もあります。その後、フェッチ要求を使用してフィルタリングを行うことができます。また、何をしているかに応じて、NSFetchedResultsControllerを使用してコアデータにさらに多くの処理をさせることができます。

2

今日は(iOS7、それは存在するからiOS5上にある)複雑な構造(辞書内、配列内の配列など)であっても、基盤オブジェクト(NSDictionary、NSArray、NSString、NSNumber ...) on ...)は、JSONのシリアル化を使用することです。

NSData *buffer = [NSJSONSerialization dataWithJSONObject:srcObject options:0 error:nil]; 
id mutableDeepCopiedObject = [NSJSONSerialization JSONObjectWithData:buffer options:NSJSONReadingMutableContainers+NSJSONReadingMutableLeaves error:nil]; 

デシリアライズのオプションを変更して、必要に応じて不変のコピーを取得することもできます。

関連する問題