如何从通知名称中创建信号?例如,我想从:
[[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) 我目前正在向这样的房产信号注册订阅者:
[RACAble(self.test) subscribeNext:^(id x) {
NSLog(@"signal fired!");
}];
Run Code Online (Sandbox Code Playgroud)
默认功能是它每次都会触发self.test被更改,但我只想要触发一次,然后取消订阅.在创建此订阅者时,是否可以将"一次"参数或修饰符传递给RAC?
有人可以提供使用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操作的简单示例.
使用ReactiveCocoa,似乎有两种方法让订阅者从信号中接收相同的值,而不是重新触发生成这些值的任何操作:通过RACReplaySubject或RACMulticastConnection.
以下是RACReplaySubject的标题文档:
重播主题保存发送的值(达到其定义的容量)并将其重新发送给新订户.它还将重播错误或完成.
对于RACMulticastConnection:
多播连接封装了向许多订户共享信号订阅的想法.如果对基础信号的订阅涉及副作用或不应多次调用,则通常需要这样做.
多播信号仅在
-[RACMulticastConnection connect]被呼叫时订阅 .在此之前,不会发送任何值signal.了解-[RACMulticastConnection autoconnect]如何-[RACMulticastConnection connect]自动调用.请注意,您不应手动创建RACMulticastConnection.而是使用
-[RACSignal publish]或-[RACSignal multicast:].
有人可以提供关于何时使用RACReplaySubject或RACMulticastConnection的简单指南?
ReactiveCocoa框架使用weakify和strongify宏,两者都以"@"符号开头.
这是一个例子(来自这个文件).
- (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
我正在使用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
我是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事件.
我正在考虑一个非常简单的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.
我的问题:
SecondViewControllerViewModel 有一个可靠的经验法则吗?SecondViewController?SecondViewController视图层次结构?(即导航推送或模态演示).我个人在想:
SecondViewController可能会在其初始化程序中创建.这总是让我走上一条令人困惑的道路:如果我想将信息传递FirstViewModel给我SecondViewModel怎么办?我应该公开SecondViewModel作为公共财产,SecondViewController以便我可以获得/设定价值吗?FirstViewController应该创造SecondViewController,和FirstViewController应该推SecondViewController到屏幕上.我的直觉认为这是次要的:我想更多地隔离ViewControllers的呈现,让应用程序更专注于ViewModel,但这似乎很难做到.(即"推"ViewModels,而非ViewControllers ......但"推"与应用程序的视觉呈现本质上相关,所以也许这是错误的思考方式.)
我在viewDidLoad中创建了一个事件订阅者,如下所示:
[RACObserve(_authenticationView.passwordInput.textField, text) subscribeNext:^(NSString* text)
{
//handle this
}];
Run Code Online (Sandbox Code Playgroud)
只要textField.text属性发生更改(预期),它就会触发,但是它在创建时也会触发一次,或者触发初始值,这不是我想要的.
当然我可以过滤掉它,但我只想过滤掉第一个事件.我该怎么做呢?
要求:
..那么最干净的方法是什么?
我正在尝试学习ReactiveCocoa并且很难开始.由于API和教程似乎很快就过时了,我不断遇到小麻烦.也许我有错误的印象.
试着遵循这个我似乎没有NoError.
应该正确导入,因为我有机会获得Signal,rac_textSignal等等.但我不知道为什么NOERROR不可用.
这种向RAC4的过渡也提到NoError了.为什么NoError未申报?我正在使用ReactiveCocoa 4.0.1.
编辑:我刚刚添加public enum NoError : ErrorType {}到文件的顶部,现在可以正常工作了.我不确定这是否是解决问题的正确方法.在指南和教程中没有提到我应该扩展ErrorType自己.
reactive-cocoa ×10
ios ×6
objective-c ×5
swift ×2
cocoa ×1
cocoa-touch ×1
macros ×1
mvvm ×1
racsignal ×1
rx-swift ×1