4

私は RxSwift で遊んでいて、単純なおもちゃのプログラムで立ち往生しています。私のプログラムには、基本的にモデル クラスとビュー コントローラーが含まれています。モデルには、非同期ネットワーク呼び出しの後にメイン キューで更新されるオブザーバブルが含まれており、viewController は 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()
    }

ラベルは 1 つだけ更新され、「0」と表示されます。ネットワーク要求の処理後、最初の更新後に「0」を表示し、2 回目の更新後に「12」を表示して、ラベルが 2 回更新されることを期待していました。dispatch_async ブロックのブレークポイントにヒットしましたが、galleryCount がオブザーバーを失ったようです。何が起こっているのか、これをデバッグする方法を知っている人はいますか?

一番

4

3 に答える 3

3

これを読んだら、誰でも興味があります。変数の名前を変更した後、オブザーバブルをViewControllerに渡すのをやめたのはリファクタリングエラーでした。代わりに、新しいものを作成しました... facepalm

于 2015-10-05T10:04:52.800 に答える
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 に答える
0

Clean and Build が問題を解決してくれました

于 2017-09-14T19:34:13.123 に答える