2015-09-28 2 views
4

Я играю с RxSwift, и я застрял в простой игрушечной программе. Моя программа по существу содержит класс модели и viewcontroller. Модель содержит наблюдаемую, которая обновляется в основной очереди после асинхронного сетевого вызова, диспетчер просмотра подписывается в viewDidLoad(). AppDelegate инициализирует модель и передает ее в ViewController и запускает сетевой запрос.Блок подписки RxSwift не называется

class GalleryModel { 

    var galleryCount: BehaviorSubject<Int> 

    init() { 
     galleryCount = BehaviorSubject.init(value:0) 
    } 

    func refresh() { 
     doAsyncRequestToAmazonWithCompletion { (response) -> AnyObject! in 
      var counter = 0 
      //process response 
      counter = 12 

      dispatch_async(dispatch_get_main_queue()) { 
       self.galleryCount.on(.Next(counter)) 
      } 
      return nil 
     } 
    } 

class ViewController: UIViewController { 

    @IBOutlet weak var label: UILabel! 

    var galleryModel: GalleryModel? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     galleryModel?.galleryCount.subscribe { e in 
      if let gc = e.element { 
       self.label.text = String(gc) 
      } 
     } 
    } 
} 

class AppDelegate: UIResponder, UIApplicationDelegate { 
    var galleryModel: GalleryModel? 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {   
     //do amazon setup   
     galleryModel = GalleryModel() 
     if let viewController = window?.rootViewController as? ViewController { 
      viewController.galleryModel = GalleryModel() 
     }  
     return true 
    } 

    func applicationDidBecomeActive(application: UIApplication) { 
     galleryModel?.refresh() 
    } 

Метка обновляется только одна, она показывает «0». Я ожидал, что ярлык будет обновляться дважды, показывая «0» после первого обновления и показывая «12» после второго обновления после обработки сетевого запроса. Точка прерывания в блоке dispatch_async попадает, но похоже, что galleryCount потерял своего наблюдателя. Кто-нибудь знает, что происходит или как отлаживать это?

Лучшее

+0

Можете ли вы подтвердить, что вызов On Next в 'GalleryModel' вызван? – Eric

+0

Проблема/проблема в том, как записывается RxSwift, я имею в виду, когда вызывается '.on (.Error())', он удаляет наблюдателя, и нет способа вызвать '.on (.Next())' снова , Единственный способ сделать это - создать новый экземпляр 'viewModel' и снова вызвать' subscribe'. Я действительно ненавижу эту библиотеку {> _ <} – eMdOS

ответ

3

В случае, если кто-либо заинтересован в этом. Это была ошибка рефакторинга, после переименования переменных я прекратил передавать наблюдаемые в ViewController. Вместо этого я создал новый ... FACEPALM

0

Here некоторые полезные фрагменты для подписки на RxSwift (на японском языке)

Например, чтобы подписаться на различные события:

let source: Observable<Int> = create { (observer: ObserverOf<Int>) in 
    sendNext(observer, 42) 
    sendCompleted(observer) 
    return AnonymousDisposable { 
     print("disposed") 
    } 
} 

let subscription = source.subscribe { (event: Event<Int>) -> Void in 
    switch event { 
    case .Next(let element): 
     print("Next: \(element)") 
    case .Completed: 
     print("Completed") 
    case .Error(let error): 
     print("Error: \(error)") 
    } 
} 
0

Очистить и построить решенных проблемы для меня

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