4

我正在玩 RxSwift,我被一个简单的玩具程序困住了。我的程序本质上包含一个模型类和一个视图控制器。该模型包含一个在异步网络调用后在主队列上更新的可观察对象,视图控制器在 viewDidLoad() 中订阅。AppDelegate 初始化模型并将其传递给 ViewController 并触发网络请求。

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 失去了它的观察者。有人知道发生了什么或如何调试吗?

最好的

4

3 回答 3

3

万一读到这篇文章有人感兴趣。这是一个重构错误,在重命名变量后,我停止将 observable 传递给 ViewController。相反,我创建了一个新的... facepalm

于 2015-10-05T10:04:52.800 回答
0

Clean and Build 为我解决了问题

于 2017-09-14T19:34:13.123 回答
0

这里有一些有用的在 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)")
    }
}
于 2015-12-22T20:27:32.677 回答