- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
应用程序从服务器拉取数据(通常是 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”模型与 native 模型分离的方法是什么?
我经常发现自己在模型中编写自定义初始化程序,它接受字典(通常来自 JSON 提要)。
例如:
// BlogPost.h
+ (BlogPost *)blogPostWithJSON:(NSDictionary *)jsonDictionary;
然后我必须跟踪服务器上使用的 key 并将它们映射到我的属性。
我总是觉得这样做有点不自在,因为应用程序中的模型实际上不必知道服务器上使用了哪些 key 。
我是否应该将这个 JSON 到对象的映射移到另一个类中?也许是工厂?或者我的网络管理员应该直接创建现成的对象并将其返回给我吗?
也许是这样的:
// NetworkManager.h
- (void)getBlogPostWithCompletion:(void (^)(BlogPost *blogPost))completionBlock;
(当然,我在这里省略了很多细节,比如要获取哪篇博文,但这只是为了演示一种方法)。
还有其他方法吗?您如何将服务器数据与本地模型分离?
最佳答案
我遇到过几次这个问题,得到的问题与您几乎相同。最后我发现对我有用的是:
这两个模型之间的映射可以根据其复杂性以不同的方式完成。我通常喜欢选择这三种方法中的一种并坚持使用,以便在项目中采用同质方法:
(class)HighLevelObject>>from(aLowLevelObject)
。这需要一个低级对象并自行配置。您对具有低级对应物的所有高级对象执行此操作。LowLevelObject>>createHighLevelObject()
。在这里,您正在将创建新对象的责任转移到较低层。如果您有简单的模型,它们之间有许多一对一的映射,我会选择选项 1 或 2。选择哪一个在很大程度上取决于您的口味;选项 1) 的优点是对象知道如何构造自身,但将转换过程的负担放在域模型中。第二种方法留下了一个“更干净”的领域模型,但迫使下层了解上层的细节,并可能迫使您打破封装。我不认为这里有 Elixir ;恕我直言,您应该选择最适合您的需求和编程品味的方法。
HTH
关于ios - 将远程数据与本地对象映射/解耦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14311654/
我是一名优秀的程序员,十分优秀!