Używam Realm w kilku małych projektach i bardzo mi się podoba. Mam nadzieję, że wykorzystam go w większych projektach i szukam lepszej struktury mojej warstwy dostępu do danych.Jak napisać lepszą warstwę dostępu do danych z Realmem
Natknąłem się na podobne question i próbowałem zebrać informacje, które tam znalazłem. Podejście omówione tutaj jest wzorem DAO, więc dałem temu szansę.
To jest moja klasa modelu.
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()
// ...
}
}
Następnie stworzyłem ChatDAOProtocol
, aby zachować wszystkie metody pomocnika wygody.
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?
}
Wreszcie stworzyłem inną klasę o nazwie ChatHelper
że wdrożone wszystkie te metody protokołu.
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
}
}
Wydaje się, że to już lepsze niż zraszanie całego kodu związanego z bazą danych w całym VC i tym podobnych. Ale wciąż mam pewne wątpliwości.
Powiedzmy na przykład, czy muszę zebrać wszystkich uczestników czatu, teraz muszę zadzwonić do tej metody na klasie ChatHelper
. A jeśli chcę uzyskać po prostu tytuł czatu, nazywam właściwością samego obiektu Chat
. Nie wygląda na bardzo zunifikowany interfejs. Czy powinienem dołączyć także obiekty pobierające i ustawiające dla wszystkich właściwości pomocnika. Tak więc obiekt Chat
nigdy nie jest wywoływany bezpośrednio (z wyjątkiem możliwości utworzenia instancji).
Albo
powinienem zrobić sam obiekt Chat
zgodne z protokołem ChatDAOProtocol
? Więc wszystkie metody wygody, jak również właściwości są bezpośrednio dostępne z obiektu Chat
prosto w górę?
A może jest lepszy sposób niż oba te sposoby?
Dzięki za odpowiedź. Wziąłbym pod uwagę wymienione punkty i przerobiłem mój kod. Czy uważasz, że preferowane jest posiadanie metod pomocniczych w tej samej klasie "Czat" lub stworzenie osobnej klasy "ChatHelper" dla tych metod pomocniczych jest lepsze? – Isuru