标签: reactive-cocoa

如何使用Reactive Cocoa和通知

如何从通知名称中创建信号?例如,我想从:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(userDidChange:)
                                             name:kTTCurrentUserLoggedOffNotification
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)

类似于:

[signalForName(kTTCurrentUserLoggedOffNotification) subscribeNext:^(id x){
...
}];
Run Code Online (Sandbox Code Playgroud)

ios reactive-cocoa

19
推荐指数
2
解决办法
8081
查看次数

如何创建仅接收一次信号的ReactiveCocoa订阅者,然后取消订阅/释放自己?

我目前正在向这样的房产信号注册订阅者:

[RACAble(self.test) subscribeNext:^(id x) {
        NSLog(@"signal fired!");
 }];
Run Code Online (Sandbox Code Playgroud)

默认功能是它每次都会触发self.test被更改,但我只想要触发一次,然后取消订阅.在创建此订阅者时,是否可以将"一次"参数或修饰符传递给RAC?

objective-c reactive-programming ios reactive-cocoa

17
推荐指数
1
解决办法
3731
查看次数

使用NSMutableArray推送/弹出的ReactiveCocoa示例?

有人可以提供使用ReactiveCocoa抽象的单行示例来实现这样的事情:

// pseudo-code
NSMutableArray *array = @[[] mutableCopy];
RACSignal *newValue = RACAbleWithStart(array); // get whole array or maybe just added/removed element on push/pop

[newValue subscribeNext:^(NSArray *x) {
  // x is whole array
}]

[newValue subscribeNext:^(id x) {
  // x is new value
}]

[newValue subscribeNext:^(id x) {
  // x is removed value
}]
Run Code Online (Sandbox Code Playgroud)

我看到NSArray的一些扩展被删除,有利于Mantle https://github.com/ReactiveCocoa/ReactiveCocoa/pull/130但是仍然找不到NSArray操作的简单示例.

reactive-cocoa

17
推荐指数
1
解决办法
5827
查看次数

何时使用RACReplaySubject与RACMulticastConnection?

使用ReactiveCocoa,似乎有两种方法让订阅者从信号中接收相同的值,而不是重新触发生成这些值的任何操作:通过RACReplaySubject或RACMulticastConnection.

以下是RACReplaySubject的标题文档:

重播主题保存发送的值(达到其定义的容量)并将其重新发送给新订户.它还将重播错误或完成.

对于RACMulticastConnection:

多播连接封装了向许多订户共享信号订阅的想法.如果对基础信号的订阅涉及副作用或不应多次调用,则通常需要这样做.

多播信号仅在-[RACMulticastConnection connect]被呼叫时订阅 .在此之前,不会发送任何值signal.了解-[RACMulticastConnection autoconnect]如何 -[RACMulticastConnection connect]自动调用.

请注意,您不应手动创建RACMulticastConnection.而是使用 -[RACSignal publish]-[RACSignal multicast:].

有人可以提供关于何时使用RACReplaySubject或RACMulticastConnection的简单指南

objective-c reactive-programming reactive-cocoa

16
推荐指数
1
解决办法
4343
查看次数

Objective-C宏的含义以at(@)符号为前缀

ReactiveCocoa框架使用weakifystrongify宏,两者都以"@"符号开头.

这是一个例子(来自这个文件).

- (RACSignal *)rac_textSignal {
        @weakify(self);
        return [[[[RACSignal
                ... 
               ];
}
Run Code Online (Sandbox Code Playgroud)

作为宏名称前缀的at符号有什么意义?(注意:我已经检查了宏,它被称为'弱化',而不是'@weakify',因此它不仅仅是宏名称!).

宏本身在这里定义:

https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTScope.h#L45

macros objective-c reactive-cocoa

16
推荐指数
2
解决办法
1011
查看次数

拆分RACSignal以消除状态

我正在使用ReactiveCocoa更新UILabel一个UIProgressView倒计时:

NSInteger percentRemaining = ...;
self.progressView.progress = percentRemaining / 100.0;

__block NSInteger count = [self.count];

[[[RACSignal interval:0.05 onScheduler:[RACScheduler mainThreadScheduler]]
    take: percentRemaining]
    subscribeNext:^(id x) {
        count++;
        self.countLabel.text = [NSString stringWithFormat:@"%d", count];
        self.progressView.progress = self.progressView.progress - 0.01;
    } completed:^{
        // Move along...
    }];
Run Code Online (Sandbox Code Playgroud)

这种方法运行得很好但是,我对count变量或者读取值都不是特别满意,self.progressView.progress以便减少它.

我觉得我应该能够直接使用RAC宏来吐出信号并绑定属性.就像是:

RACSignal *baseSignal = [[RACSignal interval:0.05 onScheduler:[RACScheduler mainThreadScheduler]]
                            take: percentRemaining]

RAC(self, countLabel.text) = [baseSignal
                                  map: ...
                                  ...

RAC(self, progressView.progress) = [baseSignal
                                        map: ...
                                        ...
Run Code Online (Sandbox Code Playgroud)

...揭示了我被困的地方.我不能完全理解如何编写RACSignal …

cocoa-touch objective-c reactive-programming reactive-cocoa racsignal

14
推荐指数
1
解决办法
3385
查看次数

在RxSwift中手动发出事件

我是RxSwift的新手,需要一个非常基本的帮助.
假设我有一个Observable并按这样订阅它.

 let source: Observable<Void> = Observable.create { [weak self] observer in

        guard let _ = self else {
            observer.on(.Completed)
            return NopDisposable.instance
        }

        observer.on(.Next())

        return AnonymousDisposable {

        }
    }
Run Code Online (Sandbox Code Playgroud)

订阅如下:

 source.subscribeNext { () -> Void in

    }
Run Code Online (Sandbox Code Playgroud)

问题是:如何在每次需要时手动将事件发送到subscribeNext.这就像rx_tap行为一样UIButton.
我在示例中看到代码有这样的东西source = button.rx_tap.asObservale().之后,每次用户点击按钮时,都会在subscribeNext()上发出一个事件并触发.我也希望这种行为,但在程序上,而不是从UI事件.

ios reactive-cocoa swift rx-swift

14
推荐指数
1
解决办法
8956
查看次数

MVVM并推送ViewController:在哪里初始化下一个ViewController和ViewModel,并推送新视图?

我正在考虑一个非常简单的ViewModel和ViewController的结构,用于测试应用程序.我有类似的东西:

FirstViewController.m:

- (IBAction)launchButtonSelected:(id)sender
{
    [self.viewModel launchActionSelected];
}
Run Code Online (Sandbox Code Playgroud)

FirstViewModel.m:

- (void)launchActionSelected
{
    // [todo] - Figure this out.
}
Run Code Online (Sandbox Code Playgroud)

当在launchButton中选中时FirstViewController,我想制作并呈现一个SecondViewController.

我的问题:

  1. 我应该在哪里创建SecondViewControllerViewModel 有一个可靠的经验法则吗?
  2. 谁应该初始化SecondViewController
  3. 我应该在哪里推进SecondViewController视图层次结构?(即导航推送或模态演示).

我个人在想:

  1. ViewModel for SecondViewController可能会在其初始化程序中创建.这总是让我走上一条令人困惑的道路:如果我想将信息传递FirstViewModel给我SecondViewModel怎么办?我应该公开SecondViewModel作为公共财产,SecondViewController以便我可以获得/设定价值吗?
  2. FirstViewController应该创造SecondViewController,和
  3. FirstViewController应该推SecondViewController到屏幕上.

我的直觉认为这是次要的:我想更多地隔离ViewControllers的呈现,让应用程序更专注于ViewModel,但这似乎很难做到.(即"推"ViewModels,而非ViewControllers ......但"推"与应用程序的视觉呈现本质上相关,所以也许这是错误的思考方式.)

mvvm ios reactive-cocoa

13
推荐指数
1
解决办法
2033
查看次数

ReactiveCocoa:仅订阅新值

我在viewDidLoad中创建了一个事件订阅者,如下所示:

[RACObserve(_authenticationView.passwordInput.textField, text) subscribeNext:^(NSString* text)
{
     //handle this
}];
Run Code Online (Sandbox Code Playgroud)

只要textField.text属性发生更改(预期),它就会触发,但是它在创建时也会触发一次,或者触发初始值,这不是我想要的.

当然我可以过滤掉它,但我只想过滤掉第一个事件.我该怎么做呢?

要求:

  • 如果密码具有新的空值,则显示验证消息(无法将密码设置为空).
  • 如果密码具有新的非空值,请与远程客户端通信.

..那么最干净的方法是什么?

cocoa objective-c ios reactive-cocoa

12
推荐指数
2
解决办法
3369
查看次数

使用ReactiveCocoa"使用未声明类型'NoError'"

我正在尝试学习ReactiveCocoa并且很难开始.由于API和教程似乎很快就过时了,我不断遇到小麻烦.也许我有错误的印象.

试着遵循这个我似乎没有NoError.

在此输入图像描述

应该正确导入,因为我有机会获得Signal,rac_textSignal等等.但我不知道为什么NOERROR不可用.

他们的文档也提到了NoError,但这导致了404.

这种向RAC4的过渡也提到NoError了.为什么NoError未申报?我正在使用ReactiveCocoa 4.0.1.

编辑:我刚刚添加public enum NoError : ErrorType {}到文件的顶部,现在可以正常工作了.我不确定这是否是解决问题的正确方法.在指南和教程中没有提到我应该扩展ErrorType自己.

ios reactive-cocoa swift

12
推荐指数
1
解决办法
3204
查看次数