标签: reactive-cocoa-3

ReactiveCocoa vs RxSwift - 优点和缺点?

所以现在有了swift,ReactiveCocoa人员已经在3.0版本中为swift重写了它

此外,还有另一个名为RxSwift的项目.

我想知道人们是否可以添加关于两个框架的设计/ api /哲学的差异的信息(请在SO的精神中,坚持真实的事情,而不是关于哪个是"最佳"的意见)

[注意StackOverflow mods:这个问题有确切的答案,答案是两个框架之间的差异.我认为这也是SO的主题

首先,我阅读ReadMe的最初印象是:

  • 作为熟悉微软"真正的"C#Rx的人,RxSwift看起来更容易识别.
  • ReactiveCococa似乎已经进入了它自己的空间,引入了新的抽象,如Signals vs SignalProducers和Lifting.一方面,这似乎澄清了一些情况(什么是热与冷信号),但另一方面,这似乎增加了框架的复杂性很多

reactive-programming swift reactive-cocoa-3 rx-swift

248
推荐指数
1
解决办法
3万
查看次数

如何在ReactiveCocoa 3和4中进行基本绑定

我最近一直在阅读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)

遗憾的是,这不起作用.

问题

  1. 该方法fetchTodaysMenu()返回一个SignalProducer<Menu, NoError> …

reactive-cocoa swift reactive-cocoa-3

10
推荐指数
1
解决办法
3653
查看次数

如何使用ReactiveCocoa 3实现基本的UITextField输入+ UIButton操作场景?

我同时是一个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)

mvvm ios reactive-cocoa swift reactive-cocoa-3

8
推荐指数
1
解决办法
3823
查看次数

可以/我应该如何用RC3替换我的KVO东西?

我正在尝试将使用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安全与使用可可豆荚已经为项目AlamofireSwiftyJSON

key-value-observing reactive-cocoa swift carthage reactive-cocoa-3

7
推荐指数
2
解决办法
614
查看次数

ReactiveCocoa将SignalProducers合二为一

我正在使用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 一起使用.但是,我很难搞清楚实现这一目的的语法.

ios reactive-cocoa swift reactive-cocoa-3

7
推荐指数
2
解决办法
3667
查看次数

如何将"SignalProducer <Bool,NoError>"转换为ReactiveCocoa 3的"SignalProducer <Bool,NSError>"?

我尝试创建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>

ios reactive-cocoa swift reactive-cocoa-3

5
推荐指数
1
解决办法
892
查看次数

如何用RAC3替换我的KVO代码并保留现有模型?

我正在研究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来说是否可行?我错过了什么关键吗?

key-value-observing reactive-cocoa swift reactive-cocoa-3

5
推荐指数
1
解决办法
338
查看次数

DynamicProperty vs MutableProperty vs AnyProperty vs ConstantsProperty

他们之间有什么区别?你能举个例子说明我应该使用dynamic/mutable/any/constants属性吗?

ios reactive-cocoa swift reactive-cocoa-3

4
推荐指数
1
解决办法
969
查看次数

将ReactiveCocoa 3和4与Core Data一起使用

我是ReactiveCocoa的新手,想NSManagedObject在Swift 2项目中使用它作为KVO的替代品.

我发现在线使用的大多数示例RACObserve()都已在RAC 3中删除(?).更改日志声明,新版本会取消KVO,我应该转到PropertyTypes.

有没有什么方法可以使用Reactive Cocoa 3和4 NSManagedObject以类似的方式使用现有的RACObserve()

core-data ios reactive-cocoa reactive-cocoa-3 swift2

3
推荐指数
1
解决办法
716
查看次数

如果信号已经发生,如何观察信号并立即收到`next`事件?

我正在尝试包装一个在网络请求后初始化对象的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

2
推荐指数
1
解决办法
989
查看次数