2017-02-08 1 views
0

저는 현재 첫 번째 스위프트 사이드 프로젝트를 준비하고 있습니다. 지금 당장 달성하기 위해 노력하고있는 것은 내 서비스 레이어가 내 Firebase 데이터베이스에 대한 업데이트를 수신 한 다음 뷰 컨트롤러를 업데이트하는 것입니다.ViewController에 서비스 레이어의 변경 사항을 경고하는 Swift 표준은 무엇입니까?

간단한 Ray Wenderlich 튜토리얼에는 ViewController 자체가 FIRDatabase 참조를 만들고 직접 결합 된 느낌을 직접 관찰합니다.

차라리 내 서비스 계층이이를 수신하고 필요한 정보를 제공하고 싶습니다. 스위프트에는 KVO가 없습니다, 맞습니까?

서비스 계층에서 VC를 업데이트하기위한 적절한 신속 표준은 무엇입니까? 알림 만이 여기에 있습니까?

편집 : 이것은 Firebase과 관련하여 바람직한 작업입니까? 나는 전에 그걸로 일하지 않았다. 더하기 측면에서, 데이터베이스는 다양한 VC에서 분리되어 서비스 레이어의 중심에 위치합니다. 단점은 사용자가 특정보기에 있지 않더라도 서비스 계층은 사용자가 현재있는 위치와 관련이없는 모든 종류의 변경 사항을 항상 관찰하게됩니다.

답변

1

Firebase 데이터베이스는 여러분이 성취하려는 것을 위해 정말 멋지다. 사실, KVO는 Objective-C에서 작동하는 것과 똑같은 NSObject에서 상속 된 클래스에서 작동합니다. 그럼에도 불구하고보기 컨트롤러를 업데이트 할 수있는 다른 옵션이 많이 있습니다.

첫 번째는 콜백을 사용하는 것입니다.

매우 유익한 방법입니다. 데이터베이스가 업데이트 될 때마다 서비스 계층에 저장된 콜백을 호출 할 수 있습니다. 뷰 컨트롤러는 서비스 계층에 콜백을 설정합니다.

서비스 층 :

let serviceLayer = ServiceLayer() 
serviceLayer.callback = { model in 
    label.text = model.name 
    //Update or do whatever you want with the model 
} 
: 당신이 serviceLayer 또는 이와 유사한의 인스턴스가있는 경우
class ServiceLayer { 

    var callback: ((Model) ->())! 

    func listenForUpdates() { 
     let ref = FIRDatabase.database().reference(withPath: "path") 
     ref.observe(FIRDataEventType.value, with: { snapshot in 
      guard let modelList = snapshot.value as? [String : AnyObject], let model = modelList["key"] as? Model else { 
       return 
      } 

      callback(model) 
     }) 

    } 

그리고 당신의 뷰 컨트롤러에서

, 당신은 다음을 수행 할 수 있습니다 예를 들어

두 번째 방법은 내가 가장 좋아하는 방법이며 Rx를 사용하는 것입니다.

신속한 리 액티브 프로그래밍 (RxSwift)을위한 기본 라이브러리이며 더 많은 옵션을 제공합니다. 처음에는 그립을 잡는 것이 꽤 어렵지만, 그만한 가치가 있습니다.

func listenForChanges() -> Observable<Model> { 
    return Observable.create { subscriber in 

     let ref = FIRDatabase.database().reference(withPath: "path") 
     ref.observe(FIRDataEventType.value, with: { snapshot in 
      guard let modelList = snapshot.value as? [String : AnyObject], let model = modelList["key"] as? Model else { 
       return 
      } 

      subscriber.onNext(model) 
     }) 

     return Disposables.create() 
    } 
} 

그리고 뷰 컨트롤러에서 : 수신으로 수행

위의 예는 다음과 같은 것

let disposeBag = DisposeBag() 
let serviceLayer = ServiceLayer() 
serviceLayer.listenForChanges() 
    .do(
     onNext: { [weak self] model in 
      label.text = model.name 
     } 
    ) 
    .subscribe() 
    .addDisposableTo(disposeBag) 

의 차이는 여기에 너무 악명 아니지만, 수신은 새로운 패러다임을 제공하는 신속하게 정말 유용합니다.

Rx에 대한 자세한 내용을 보려면 http://reactivex.io/