2017-05-04 8 views
4

우선 iOS에서 상대적으로 새롭고 모바일 DB를 사용하는 경험이 없습니다.영역 (ios)에 대한 저장소를 사용해야합니까?

내 앱 영역 (신속)에 통합하려는 경우 서비스 계층과 저장소를 구분하거나 모든 것을 서비스에 포함시키는 것이 합리적인지 궁금합니다.

좋은 예가있는 몇 가지 예입니다.

class UserService { 

    var userRepository: UserRepository! 

    func findById(userId: String) -> User? { 
     return userRepository.findById(userId: userId) 
    } 
} 

class UserRepository { 

    private let realm = try! Realm() 

    func findById(userId: String) -> User? { 
     return realm.object(ofType: User.self, forPrimaryKey: userId) 
    } 
} 

답변

3

데이터베이스 API를 맨 위에 추상화 계층을 추가하기는 매우 일반적이다. 다른 많은 개발자가 비즈니스 로직 코드에서 API를 숨기기 위해 자신의 클래스에서 Realm을 래핑했습니다.

  1. 당신이에서하지 실수로 다치게 성능 carful 할 필요가 :

    가있는주의해야 할 사항 몇 가지가있다. 일부 사용자는 Realm 객체에서 자신의 객체로 데이터를 복사하는 데까지 나아갔습니다. 이것은 Realm의 'zero-copy'메커니즘의 목적을 무효로 만들었으므로 이제는 Realm을 기본적으로 사용하는 것보다 본질적으로 성능이 떨어집니다.

  2. 이것은 '선제 작업'입니다. 당신은 많은 일을 앞두고 있습니다. 경우에만 당신은 당신의 마음을 바꿀지도 모릅니다. 오래 전에 대규모 응용 프로그램에서 Core Data를 Realm으로 변환 한 것은 불과 몇 시간 밖에 걸리지 않았습니다. 당신이 갚지 못할 수도있는 소리를 사용하지 않을 수도있는 '일반적인'데이터베이스 솔루션을 설계하려고합니다.
  3. 앱의 복잡성이 증가하고 있습니다. 이는 버그 가능성이 더 커짐을 의미하며 API와 데이터베이스 API가 동기화되어 있는지 확인하기 위해 더 엄격한 테스트가 필요합니다.

이동하려는 새 데이터베이스가 개체 (예 : 핵심 데이터)로 구성되어 있으면 한 데이터베이스에서 다른 데이터베이스로 변환하는 것이 일반적으로 많은 작업이 아닙니다. 따라서 필자는 불필요한 작업을 피할 필요가있을 때까지 피하는 것을 권장합니다.

면책 조항 : 나는 Realm에서 일하지만 이것은 Core Data, 원시 SQLite 및 Realm을 사용하여 개인용 응용 프로그램을 출하 한 사람으로 생각합니다.

+0

안녕하세요, Tim은 귀하가 Realm 팀에서 일한 것을 알고 있습니다. 점 1에 대해이 시나리오에 대해 권장하는 것은 무엇입니까? 다른 곳에서는 삭제되었지만 병렬로 액세스하려는 영역 개체가 있습니다.이 개체는 한 번에 더 이상 영역에 없으므로 충돌하려고합니다. 저는 여러분이 1 번에서 설명한 것과 비슷한 것을하려고 생각했지만, 이제는 가치가 없을 수도 있다는 것을 읽었습니다. 내가 생각하기에 영역과 타입 의존성 주입을 가진 일반적인 저장소를 사용하고 싶습니다. – Cyupa

+1

안녕하세요 @ 큐파! 디스크의 동일한 객체를 가리키는 두 개의 Realm'Object' 인스턴스가있는 경우 객체의 한 인스턴스를 삭제하면 다른 인스턴스가 자동으로 무효화되고 더 이상 인스턴스의 데이터를 읽을 수 없습니다. '삭제 이유'에 따라 데이터가 삭제 이후에 보관되기를 원하지만 인 메모리 복사본을 만드는 것은 여전히 ​​받아 들일 수있는 절충안입니다. – TiM

+0

안녕하세요 @ 티엠, 작은 세부 사항 : 우리는 하나의 "영역"을 앱 안에 보관해야합니까? 아니면 이와 같은 각 저장소 또는 확장 방법에 대해 작성해야합니까? private let realm = try! 영역() –

1

확장을 사용하여 가져 오기 방법을 추가 할 수 있습니다. 데이터베이스의 각 엔티티에 대한 객체 하위 클래스를 추가 한 다음 필요할 때 이러한 메소드에 대해 각각에 확장을 추가합니다. 예 : 당신 가져 오는 방법에 대한

import RealmSwift 

// Dog model 
class Dog: Object { 
    dynamic var name = "" 
    dynamic var owner: Person? // Properties can be optional 
} 

:

extension Dog { 
    class func fetch(with name: String) -> Dog? { 
     return try! Realm().objects(Dog.self).filter("name == %@", name).first 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 제가 틀렸다면 저장소 레이어가 필요 없다고 가정하십시오. 그렇다면 CoreData로 변경하기로 결정한 다음 제거/모든 확장을 변경해야합니다. 내 모든 모델 또는? – mihatel

+0

CoreData에서도 확장을 사용할 수 있습니다. 당신은이 튜토리얼을 거꾸로 따라갈 수 있습니다 : https://news.realm.io/news/migrating-from-core-data-to-realm – pesch

+0

이것은 CoreData의 것입니다. 그러나 어떤 경우에는 당신의 생각을 가지고 있습니다 ... 장래에 DB를 변경해야하는 경우 (패턴) 더 편리하다고 생각한 이유 – mihatel