2017-01-08 7 views
0

私は、サーバーからjsonとしてデータを取り出し、さまざまな種類のオブジェクトにシリアル化するiOSアプリケーションを用意しています。型は複雑になる可能性があり、サブタイプを含むことができ、継承することができるため、制限はありません。すべてをさらに複雑にするもう1つのタイプは、AnyObjectとして格納されるタイプのものですか?実行時にのみ、それらは特定の規則に従って実際の型にシリアル化されています。そのような何か:複雑な動的オブジェクトをローカルに保存する方法(iOS、swift)

class A { 
    var typeName: String? 
    var b: AnyObject? 
} 

それは、それはそのような何かを行うことができ連載のそのとき:

また、すべてのデータに対して行われるべきで問い合わせる
if let someClass = NSClassFromString(typeName) as? SomeGenericType.Type{ 
     b = someClass.init() 
} 

。現在、私はそれらをすべてローカルに保存しようとしていますが、メモリにロードしてコードからクエリを取得しています。私はユーザーのデフォルトを使用していますが、いくつかの制限があります。また、カスタムコードを提供して機能させる必要がありました。新しいフィールドを追加するたびに、コーディングで何かが欠けていて、何も動作しませんでした。それは痛みです。

理想的には、いくつかの魔法のコマンドを実行するだけで、すべてのオブジェクトはどれほど複雑であってもローカルストレージに送信されます。同じものをこのストレージから取り出します。また、ユーザーがデータを変更するので、プライマリJsonだけを保存することはできません。そして、私はそれが苦痛であるとしても、オブジェクトをジェイソンに隠したくはありません。

提案がありますか?

+0

sqliteまたはcoredataに保存できます! – Lion

+0

レルムを使用することもできます。それは、今日、人気があり、CoreDataよりはるかに簡単です。 – Axel

+0

@Lion、私はsqliteについて考えましたが、それはリレーショナルデータベースであり、私のデータはリレーショナルではなく、どのスキーマにも適合できません。それはsqliteで動作しますか? – mimic

答えて

0

sqliteを使用する場合は、オブジェクト全体を1つの行に格納することができます。私はあなたがIDと2番目の列を持つテーブルを作成することができることを意味し、2番目はあなたのデータオブジェクトです(データ型はBLOBでなければなりません)。その後、オブジェクト全体をデータに変換します。次に、sqliteテーブルに格納し、データとして取得し、使用するときはオブジェクトに変換します。このようにして、オブジェクトは同じ形式で表示されます。

+0

興味深い。どんなタイプであっても、オブジェクト全体をこのデータベースに「入れる」ことができますか? – mimic

+0

あなたはデータに変換する必要があります! – Lion

0

Firebaseオンライン同期のためのものですが、オフラインにしてローカルキャッシュに対してクエリを実行することもできます。それはJSONを使用します。

CouchDBには、iOS用のモバイル版もあります。

あなたのデータセットが小さい場合、これらの両方が無効になります。テキストファイルとして保存し、JSONを読み込むだけです。パフォーマンス特性hereを参照してください。グラフは7MBファイルのため、それよりもはるかに少ない場合は読み込み時間が最小限に抑えられます。

+0

ありがとうございます。あなたのアプローチの問題は、Jsonではなくオブジェクトを保存する必要があることです。更新を参照してください。 – mimic

+0

私があなたに与えた多くのライブラリで、オブジェクトを1行でJSONに変換することができます。たとえば、ObjectMapperの場合:Mapper < MyObject > .toJSONString(user、prettyPrint:false)。それは、リレーショナルでもなくても、データベースにプロパティを個別にシリアル化するよりもコーディングが少なくて済みます。ちなみに、firebaseとcouchDBで長いことをするのであれば、リレーショナルDBのようにキー値のペアを書くことができます。 JSONを渡すことはありません。 JSONを内部ストレージとして使用するようになります。オブジェクトが正しく再構成されている限り、そのオブジェクトがどのように格納されているかは関係ありません。 –

+0

"私に多くの図書館を貸してくれました"という言い方は分かりません。私はあなたが提供したリンクで、今のところは1つのみを見ました。そして、私が望まないものをフィールドごとにオブジェクトフィールドで処理する必要がありました。 – mimic

0

NSKeyedArchiver.archivedData(withRootObject:)は、カスタムオブジェクトをDataオブジェクトとして保存するのに最適です。これを使用できるようにするために必要なのは、カスタムオブジェクトをNSCodingに準拠させることだけです。偉大な例では、ここで見つけることができます:あなたは、オブジェクトのDataバージョンを持っていたら

Save custom objects into NSUserDefaults

、それは簡単にCoreDataでプロパティとして、あるいはアプリのキーチェーンエントリで、UserDefaultsに保存することができます。ユースケース、データの機密性、および保存するデータの量に応じて、任意の数のストレージメソッドを使用できます。 NSKeyedArchiver.archivedData(withRootObject:)を使用すると、それらのいずれかをかなり使用することができます。

+0

投稿のユーザーのデフォルトに関連する部分を完全に無視したのはなぜですか?私は、オブジェクトが複雑なときに苦痛だと言った。私はすでにこのロジックを実装して2日間かけて問題を解決しましたが、今はもう一度修正するのに疲れています。なぜなら、おそらくヌルかもしれない新しいフィールドを追加し、KeyedArchiveによって処理できないさらなる努力。 – mimic

+0

申し訳ありません。私は開発者としてのすべての問題を解決した銀色の弾丸を探していることを理解していませんでした。あなたがそれを見つけたら私に知らせて、私は別の仕事を探すことができます。乾杯! – Jake

+0

あなたは間違っています。あなたは、他の人が書いていることの感覚を見逃したり変えたりする傾向があります。あまりスマートではありません。 – mimic

関連する問題