所以现在有了swift,ReactiveCocoa人员已经在3.0版本中为swift重写了它
此外,还有另一个名为RxSwift的项目.
我想知道人们是否可以添加关于两个框架的设计/ api /哲学的差异的信息(请在SO的精神中,坚持真实的事情,而不是关于哪个是"最佳"的意见)
[注意StackOverflow mods:这个问题有确切的答案,答案是两个框架之间的差异.我认为这也是SO的主题
首先,我阅读ReadMe的最初印象是:
我最近一直在阅读ReactiveCocoa v3,而我正在努力设置基本的东西.我已经阅读了变更日志,测试,少数SO问题和Colin Eberhardt关于这个主题的文章.但是,我仍然缺少基本绑定的示例.
假设我有一个提供当天菜单的应用程序.该应用程序正在使用RAC3和MVVM模式.
型号(菜单)
该模型有一个简单的方法来获取今天的菜单.至于现在,这不做任何网络请求,它基本上只是创建一个模型对象.该mainCourse物业是一个String.
class func fetchTodaysMenu() -> SignalProducer<Menu, NoError> {
return SignalProducer {
sink, dispoable in
let newMenu = Menu()
newMenu.mainCourse = "Some meat"
sendNext(sink, newMenu)
sendCompleted(sink)
}
}
Run Code Online (Sandbox Code Playgroud)
ViewModel(MenuViewModel)
视图模型公开了不同的String变量,让视图控制器显示菜单.让我们只添加一个属性来显示主菜.
var mainCourse = MutableProperty("")
Run Code Online (Sandbox Code Playgroud)
我们为这个属性添加一个绑定:
self.mainCourse <~ Menu.fetchTodaysMenu()
|> map { menu in
return menu.mainCourse!
}
Run Code Online (Sandbox Code Playgroud)
ViewController(MenuViewController)
最后但同样重要的是,我想在视图中介绍这个主要课程.我会UILabel为此添加一个.
var headline = UILabel()
Run Code Online (Sandbox Code Playgroud)
最后我想text通过观察我的视图模型来设置该UILabel 的属性.像这样的东西:
self.headline.text <~ viewModel.headline.producer
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这不起作用.
问题
fetchTodaysMenu()返回一个SignalProducer<Menu, NoError> …我同时是一个Swift和ReactiveCocoa noob.使用MVVM和Reactive Cocoa v3.0-beta.4框架,我想实现此设置,以了解新RAC 3框架的基础知识.
我有一个文本字段,我希望文本输入包含超过3个字母,以进行验证.如果文本通过验证,则应启用下面的按钮.当按钮收到触地事件时,我想使用视图模型的属性触发操作.
由于目前关于RAC 3.0 beta的资源很少,我通过阅读框架的Github repo上的QA来实现以下内容.到目前为止,这是我能想到的:
ViewModel.swift
class ViewModel {
var text = MutableProperty<String>("")
let action: Action<String, Bool, NoError>
let validatedTextProducer: SignalProducer<AnyObject?, NoError>
init() {
let validation: Signal<String, NoError> -> Signal<AnyObject?, NoError> = map ({
string in
return (count(string) > 3) as AnyObject?
})
validatedTextProducer = text.producer.lift(validation)
//Dummy action for now. Will make a network request using the text property in the real app.
action = Action { _ in
return SignalProducer { sink, disposable in …Run Code Online (Sandbox Code Playgroud) 我正在尝试将使用Facebook的KVOController的objc应用程序移植到Swift.我被鼓励将RC3看成是一种替代的,更加迅捷的方法.我已经阅读了一些博客,我很鼓励尝试一下.但是很多文档和博客似乎都集中在套接字和定时器上作为例子.所以我现在有两个简单的问题:
1)给出一个objc片段,如:
[self.KVOController observe: self.site keyPath: @"programs" options: NSKeyValueObservingOptionInitial block:^(id observer, id object, NSDictionary *change) {
[self.tableView reloadData];
}];
Run Code Online (Sandbox Code Playgroud)
用RC3 API重写这个的简单方法是什么?self.KVOController unobserve: self.site当视图卸载时,RC3等效于什么?
2)建议我使用Carthage来获取RC3代码.我可以混用一个Cartfile安全与使用可可豆荚已经为项目Alamofire和SwiftyJSON?
key-value-observing reactive-cocoa swift carthage reactive-cocoa-3
我正在使用ReactiveCocoa,我有几个SignalProducers
let center = NSNotificationCenter.defaultCenter()
let signalProducer1 = center.rac_notification(name: notificationName1, object: nil)
let signalProducer2 = center.rac_notification(name: notificationName2, object: nil)
let signalProducer3 = center.rac_notification(name: notificationName3, object: nil)
Run Code Online (Sandbox Code Playgroud)
我想将它们组合成一个信号产生器,只要其中一个产生信号就会产生信号.
起初,该combineLatest功能看起来是一个很好的解决方案
let combinedProducer = combineLatest(signalProducer1, signalProducer2, signalProducer3)
Run Code Online (Sandbox Code Playgroud)
但是,根据这篇文章,生成的生产者只有在三者都产生信号时才产生第一个信号.
这个交互式图表显示了我想要的内容,因此我希望将该flatten功能与.MergeFlatteningStrategy 一起使用.但是,我很难搞清楚实现这一目的的语法.
我尝试创建Action<AnyObject?, Bool, NSError>ReactiveCocoa 3 的实例.
let action: Action<AnyObject?, Bool, NSError> = Action { _ in
if self.flag {
return self.fooSignalProducer // SignalProducer<Bool, NoError>
} else {
return self.barSignalProducer // SignalProducer<Bool, NSError>
}
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译错误'SignalProducer<Bool, NoError>' is not convertible to 'SignalProducer<Bool, NSError>'.
我怎样才能转换SignalProducer<Bool, NoError>成SignalProducer<Bool, NSError>?
我正在研究ReactiveCocoa来改进我们的Swift代码.作为一个起点,我想将标签的文本绑定到属性的转换值.基本上,我想替换一些KVO代码.所以,我有以下变量:
@IBOutlet weak var myLabel: UILabel!
var myModel: MyModel
Run Code Online (Sandbox Code Playgroud)
由于我们的模型是在Objective-C中开发的,所以MyModel看起来像这样:
@interface MyModel : NSManagedObject
@property (nonatomic, retain) NSNumber * value;
@end
Run Code Online (Sandbox Code Playgroud)
因此,我想做这样的事情:
myLabel.text <~ myProperty.rac_signalForSelector("value")
|> map { (value: NSNumber) in
return "\(value.integerValue + 1)"
}
Run Code Online (Sandbox Code Playgroud)
但是,这显然不起作用.我该如何处理这个问题?KVO如何通常用正常的模型属性实现?
我已经找到了关于这个主题的类似帖子.接受的答案建议使用ViewModels.但是,我不想用ViewModels替换现有的NSManagedObject模型,而是希望保留我的模型,因为我喜欢通过XCode管理它们并通过CoreData存储它们.或者这对ViewModels来说是否可行?我错过了什么关键吗?
他们之间有什么区别?你能举个例子说明我应该使用dynamic/mutable/any/constants属性吗?
我是ReactiveCocoa的新手,想NSManagedObject在Swift 2项目中使用它作为KVO的替代品.
我发现在线使用的大多数示例RACObserve()都已在RAC 3中删除(?).更改日志声明,新版本会取消KVO,我应该转到PropertyTypes.
有没有什么方法可以使用Reactive Cocoa 3和4 NSManagedObject以类似的方式使用现有的RACObserve()?
我正在尝试包装一个在网络请求后初始化对象的API调用.我不希望每个新观察者都发生网络请求,因此据我所知,我不应该使用SignalProducer.但是,通过使用单个Signal,只有它的第一次使用将接收next事件,而任何较新的订户将永远不会收到当前值.我该怎么做?我可能正在做一些与RAC根本错误的事情.
extension SparkDevice {
static func createMainDeviceSignal() -> Signal<SparkDevice, NSError> {
return Signal {
sink in
SparkCloud.sharedInstance().getDevices { (sparkDevices: [AnyObject]!, error: NSError!) -> Void in
if let error = error {
sink.sendFailed(error)
}
else {
if let devices = sparkDevices as? [SparkDevice] {
if devices.count > 0 {
sink.sendNext(devices[0])
}
}
}
}
return nil
}
}
}
class DeviceAccess {
let deviceSignal: Signal<SparkDevice, NSError>
init() {
self.deviceSignal = SparkDevice.createMainDeviceSignal()
}
}
Run Code Online (Sandbox Code Playgroud)
我考虑使用MutableProperty …
reactive-programming reactive-cocoa swift reactive-cocoa-3 swift2