2017-02-08 1 views
0

Я в настоящее время взбиваю первый проект Swift. То, что я пытаюсь достичь прямо сейчас, заключается в том, чтобы мой сервисный уровень прослушивал обновления в моей базе данных Firebase, а затем обновлял контроллеры представлений.Какова норма Swift для предупреждения вашего ViewController изменений с вашего уровня обслуживания?

Простой учебник Ray Wenderlich, на котором я нахожусь, имеет сам ViewController, создающий ссылку на FIRDatabase, и наблюдение непосредственно, которое слишком тесно связано.

Я бы предпочел, чтобы мой сервисный уровень слушал это, а затем делал это с нужными. В Свифте нет КВО, правильно?

Что было бы подходящей нормой Swift для обновления VC со своего уровня обслуживания? Являются ли оповещения только для меня?

РЕДАКТИРОВАТЬ: Это желанная вещь, связанная с Firebase. Раньше я с ним не работал. С положительной стороны, база данных будет отделена от разных VC и будет центральной для уровня сервиса, что отлично. С другой стороны, хотя пользователь не находится в определенном виде, сервисный уровень всегда будет наблюдать всевозможные изменения, которые, возможно, не имеют отношения к тому, где находится пользователь.

ответ

1

Базы данных Firebase действительно круты для того, чего вы пытаетесь достичь. Фактически, KVO работает над классами, которые унаследованы от NSObject, так же, как и в Objective-C. Тем не менее, у вас есть много других возможностей для обновления вашего контроллера.

Первый - использовать обратные вызовы.

Это очень быстрый способ сделать это. Каждый раз, когда база данных обновляется, вы можете вызвать обратный вызов, который хранится на вашем уровне обслуживания. Контроллер представления устанавливает обратный вызов в уровне обслуживания.

Например:

Ваш уровень услуг:

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) 
     }) 

    } 

И в контроллере представления, если у вас есть экземпляр serviceLayer или что-то подобное, вы можете сделать следующее:

let serviceLayer = ServiceLayer() 
serviceLayer.callback = { model in 
    label.text = model.name 
    //Update or do whatever you want with the model 
} 

Второй способ, и мой любимый, - использовать Rx.

Его основная библиотека для реактивного программирования в быстрой (RxSwift) и дает вам еще много возможностей. На первый взгляд трудно получить контроль над этим, но это того стоит.

В предыдущем примере сделан с Rx будет следующий:

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 приносит новую парадигму, действительно полезно быстро.

Если вы хотите получить дополнительную информацию о Rx, см. Следующую ссылку http://reactivex.io/

Смежные вопросы