【发布时间】:2017-06-17 22:48:33
【问题描述】:
我一直在一些小项目中使用 Realm,我非常喜欢它。我希望继续在更大的项目中使用它,并且我正在寻找更好的数据访问层结构。
我遇到了类似的question,并试图根据我在那里找到的信息进行构建。那里讨论的方法是 DAO 模式,所以我试了一下。
这是我的模型类。
class Chat: Object {
dynamic var id: String = ""
dynamic var createdAt: Date = Date()
dynamic var creatorId: String = ""
dynamic var title: String?
let chatMessages = List<ChatMessage>()
override static func primaryKey() -> String? {
return "id"
}
convenience init(fromJSON json: JSON) {
self.init()
// ...
}
}
然后我创建了一个ChatDAOProtocol 来保存所有便利的辅助方法。
protocol ChatDAOProtocol {
func addMessage(_ message: ChatMessage)
func getChatThumbnail() -> UIImage
func getParticipants(includingMe: Bool) -> [Participant]?
static func getChat(fromId id: String) -> Chat?
static func getChat(fromCreatorId id: String) -> Chat?
}
最后,我创建了另一个名为 ChatHelper 的类,它实现了所有这些协议方法。
class ChatHelper: ChatDAOProtocol {
func addMessage(_ message: ChatMessage) {
}
func getChatThumbnail() -> UIImage {
return UIImage()
}
func getParticipants(includingMe: Bool) -> [Participant]? {
return nil
}
static func getChat(fromId id: String) -> Chat? {
return nil
}
static func getChat(fromCreatorId id: String) -> Chat? {
return nil
}
}
这似乎比在 VC 和其他东西上散布所有与数据库相关的代码要好。但我还是有些疑惑。
例如,假设我需要获取聊天的所有参与者,现在我必须调用 ChatHelper 类上的方法。如果我只想获得聊天标题,我调用Chat 对象本身的title 属性。似乎不是一个非常统一的界面。我是否也应该在帮助器中包含所有属性的 getter 和 setter。所以Chat 对象永远不会被直接调用(除了可能创建一个实例)。
或者
我应该让Chat 对象本身符合ChatDAOProtocol 协议吗?那么所有的便捷方法和属性都可以直接从Chat 对象直接访问?
或者有比这两种方法更好的方法吗?
【问题讨论】:
标签: ios swift realm dao data-access-layer