据我了解,RACSubject
ReactiveCocoa 4 的等价物是Observer
类。我希望将信号和观察者链接在一起,以便信号发送事件,将映射操作应用于发送给观察者的事件。在 Obj-C 中,它看起来像这样:
// ViewModel.h
@interface ViewModel
@property (readonly) RACSubject *someAction; //expects e.g. int values
@property (readonly) RACSignal *someSignal; //sends e.g. string values
@end
// ViewModel.m
//redeclaring the signal and action as readwrite
@implementation
- (id)init {
_someAction = [RACSubject subject];
_someSignal = [_someAction map:^id(NSNumber *index) {
return "Some string based on index passed in";
}];
}
@end
现在,当有人将一个值推送到 上someAction
时,someSignal
将触发一个包含派生值的事件。如何在 Swift 中实现相同的效果?
到目前为止我能做的是这样的:
public class ViewModel: NSObject {
public let (internalSignal, someAction) = Signal<Int, NoError>.pipe()
public var someSignal: Signal<String, NoError> {
get {
return self.internalSignal.map({ [unowned self](index: Int) -> String in
return "Some string value based on \(self.someArray[index])"
})
}
}
public let someArray = [1, 2, 3, 4, 5]
}
这看起来像一个糟糕的解决方案,因为
internalSignal
应该是私有的,但需要声明为公共的,以便将其与 Signal 的管道相匹配someSignal
因此,每次需要时都会计算它,即使相同的信号可以一遍又一遍地重复使用。也不能声明为let
常量。