【发布时间】:2016-05-19 12:45:45
【问题描述】:
据我了解,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常量。
【问题讨论】:
标签: objective-c swift reactive-cocoa reactive-cocoa-4