2016-02-03 26 views
1

我是ReactiveCocoa的新手。在我斯威夫特的ViewController,我想觀察/聽在RecipeSwipingViewModel以下方法的調用:如何觀察ViewModel中的方法調用?

func fillSwipingQueueWith(recipeSwipingCards: [RecipeSwipingCardVM]) { ... } 

不幸的是,我不能得到這個工作,但我想這是一個很常見的情況。我嘗試了幾個變化:

self.viewModel.rac_signalForSelector("fillSwipingQueueWith")... 
self.viewModel.rac_signalForSelector("fillSwipingQueueWith:")... 
self.viewModel.rac_signalForSelector(Selector("fillSwipingQueueWith:"))... 
self.viewModel.rac_signalForSelector("fillSwipingQueueWith:", fromProtocol:NSProtocolFromString("RecipeSwipingViewModel")... 

我錯過了什麼?實際上是否可以偵聽另一個對象(沒有協議)內的方法調用?非常感謝幫助。

乾杯,赫拉爾

回答

1

rac_signalForSelector由Objective-C運行特徵實現。爲了使其在斯威夫特工作,你必須標記你的方法dynamic

dynamic func fillSwipingQueueWith(recipeSwipingCards: [RecipeSwipingCardVM]) 

然後,rac_signalForSelector("fillSwipingQueueWith:")信號應corretly發送。

注意,如果該方法是純Swift函數(例如,它需要Swift結構參數)或者該方法的類不從NSObject繼承,則這是不可能的。 Swift觀察方法調用的方式是使信號清晰。例如:

class ViewModel { 
    let (callSignal, callObserver) = Signal<[RecipeSwipingCardVM], NoError>.pipe() 

    func fillSwipingQueueWith(recipeSwipingCards: [RecipeSwipingCardVM]) { 
     // function implementation 

     callObserver.sendNext(recipeSwipingCards) 
    } 
} 

self.viewModel.callSignal.observeNext { recipeSwipingCards in 
    print("method call") 
}