アプリケーションがサーバー(通常はJSON文字列)からデータをプルするのは、かなり一般的なシナリオです。次に、このデータが解析され、NSString、NSArray、NSDictionaryなどのネイティブクラスに変換されます。
ただし、ほとんどの場合、このリモートデータを表すためにカスタムモデルを使用する必要があります。
たとえば、ブログ投稿のJSON配列を取得する場合、それらをBlogPostモデルオブジェクトにマップします。たとえば、次のようになります。
// BlogPost.h
@interface BlogPost: NSObject
@property NSString *title;
@property NSString *body;
@property NSDate *dateCreated;
@property NSArray *comments;
@end
「JSON」モデルをネイティブモデルから切り離すためのアプローチは何ですか?
私はしばしば、辞書(通常はJSONフィードから取得)を取得するカスタム初期化子をモデル自体に記述していることに気付きます。
例えば:
// BlogPost.h
+ (BlogPost *)blogPostWithJSON:(NSDictionary *)jsonDictionary;
次に、サーバーで使用されているキーを追跡し、それらを自分のプロパティにマップする必要があります。
アプリケーションのモデルは、サーバーで使用されているキーを実際に知る必要がないため、これを行うのは常に少し不安です。
代わりに、このJSONからオブジェクトへのマッピングを別のクラスに移動する必要がありますか?おそらく工場?または、ネットワークマネージャーが既製のオブジェクトを作成して直接私に返す必要がありますか?
おそらく次のようなものです:
// NetworkManager.h
- (void)getBlogPostWithCompletion:(void (^)(BlogPost *blogPost))completionBlock;
(もちろん、どのブログ投稿を取得するかなど、ここでは多くの詳細を省略していますが、それはアプローチを示すためだけのものです)。
他のアプローチはありますか?サーバーデータをローカルモデルからどのように切り離しますか?