我正在使用UAGitHubEngineGitHub的API.我想写一个功能性的被动应用程序来获取一些数据.我依靠这里的代码来设置异步网络请求.我正在寻找的是一些名为"General"的团队的团队ID.我可以做过滤/打印部分OK:
[[self.gitHubSignal filter:^BOOL(NSDictionary *team) {
    NSString *teamName = [team valueForKey:@"name"];
    return [teamName isEqualToString:@"General"];
}] subscribeNext:^(NSDictionary *team) {
    NSInteger teamID = [[team valueForKey:@"id"] intValue];
    NSLog(@"Team ID: %lu", teamID);
}];
但是设置命令对我来说是一个谜:
self.gitHubCommand = [RACCommand command];
self.gitHubSignal = [self.gitHubCommand addSignalBlock:^RACSignal *(id value) {
    RACSignal *signal = ???
    return signal;
}];
当某些异步网络调用返回时,如何设置信号块以返回推送事件的信号?
出于某种原因,我没有收到错误消息.(我在这里简化了代码以直截了当.)
// Send an error message 
_loginButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendError:error]; // Pretend this is a real error
        return nil;
    }];
}];
// Subscribe to loginButton's returned signal
[_loginButton.rac_command.executionSignals subscribeNext:^(RACSignal *loginSignal) {
    [loginSignal subscribeError:^(NSError *error) {
         NSLog(@"A");
    } completed:^{
         NSLog(@"B");
    }];
}];
这打印"B".知道为什么吗?如果-sendError:在订户上调用,为什么完成块会收到它?
我的任务是为应用程序添加一些检测逻辑,以跟踪各种API调用的延迟.我正在努力想出一种干净的,无副作用的方法来为返回RACSignal(延迟执行API调用)的方法添加时序检测.
completed活动时记录时间我唯一能想到的就是创建一个处理定时器逻辑的具体RACSubscriber子类.除了令人讨厌的子类,这显然不是理想的,因为它需要一个显式subscribe:,这反过来需要一个replay源信号.此外,调用者还有一个负担,因为他们必须至少重构以获得信号的临时句柄.
@interface SignalTimer : RACSubscriber
@property (nonatomic) NSDate *startDate;
@end
@implementation SignalTimer
- (void)didSubscribeWithDisposable:(RACDisposable *)disposable
{
    [super didSubscribeWithDisposable:disposable];
    self.startDate = [NSDate date];
}
- (void)sendCompleted
{
    NSTimeInterval duration = [[NSDate date] timeIntervalSinceDate:self.startDate];
    NSLog(@"Time elapsed: %f", duration);
    [super sendCompleted];
}
@end
用法如下所示:
- (RACSignal*)saveFoo:(Foo*)fooParseObj {
    RACSignal *save = [[fooParseObj rac_save] replay]; // Don't forget replay!
    [save subscribe:[[SignalTimer alloc] initWithName@"Saving the user's foo …我有一个实现UICollectionViewDelegate协议的类.
我正在使用rac_signalForSelector:来注册这样的选择:
[self rac_signalForSelector:@selector(collectionView:didSelectItemAtIndexPath:)]
但是只有在我离开collectionView的一个空实现时才会触发:didSelectItemAtIndexPath:这样:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    // Empty
}
我尝试使用rac_signalForSelector:fromProtocol:也没有运气.
我正在使用Reactive Cocoa 2.2.4
谢谢,Mikkel
我正在尝试将使用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];
}];
用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的所有基本组件(从概念上讲),通过了解如何将所有组件连接在一起仍然有点令人困惑.
例如,在阅读了有关Signal之后,我完全希望SignalProducer只有一个start()方法返回一个Signal,你可以这样使用它:
mySignalProducer.start().observe(myObserver)
相反,你必须将观察者传递给start(),SignalProducer为你调用observe():
mySignalProducer.start(myObserver)
这意味着SignalProducer的接口要大得多(更需要理解),因为observe()的所有变量都必须在start()上重复(例如startNext()等).
我认为这里有两种可能性:
如果是1,我猜这与内存管理和一次性用品有关,我还不完全了解.
我更担心2是这样的.在内部,我对SignalProducer的理解基本上映射到Factory的概念,例如:
mySignalFactory.createSignal().observe(myObserver)
这就是为什么我很惊讶我们没有找到返回Signal的start().
如果社区可以在这里阐明一点,我将非常感激.
谢谢!
我正在尝试使用RxSwift编写一个MVVM,并与我在ReactiveCocoa中为Objective-C做的比较,以正确的方式编写我的服务有点困难.
例子是登录服务.
使用ReactiveCocoa(Objective-C)我编写如下代码:
// ViewController
// send textfield inputs to viewmodel 
RAC(self.viewModel, userNameValue) = self.fieldUser.rac_textSignal;
RAC(self.viewModel, userPassValue) = self.fieldPass.rac_textSignal;
// set button action
self.loginButton.rac_command = self.viewModel.loginCommand;
// subscribe to login signal
[[self.viewModel.loginResult deliverOnMainThread] subscribeNext:^(NSDictionary *result) {
    // implement
} error:^(NSError *error) {
    NSLog(@"error");
}];
我的viewModel应该是这样的:
// valid user name signal
self.isValidUserName = [[RACObserve(self, userNameValue)
                         map:^id(NSString *text) {
                             return @( text.length > 4 );
                         }] distinctUntilChanged];
// valid password signal
self.isValidPassword = [[RACObserve(self, userPassValue)
                         map:^id(NSString *text) {
                             return @( text.length > …如果RACSignal没有订阅者,我将如何实现停止发布?如果有订阅者则自动启动?
这是一个场景:
让我们说我有一个currentLocationSignal在AppDelegate.当视图卸载时,我LocationViewController会订阅currentLocationSignal视图加载和取消订阅(dispose).由于获取当前位置需要几秒钟,我希望始终订阅currentLocationSignal应用程序打开的时间(并在几秒钟后自动取消订阅),所以当我到达时,LocationViewController我会得到一个准确的位置.因此,信号可能有多个订户.当第一个用户收听时,它需要开始呼叫startUpdatingLocation,当没有用户需要呼叫时stopUpdatingLocation.
cocoa-touch objective-c reactive-programming ios reactive-cocoa
某些事件后如何停止接收新名字?
[RACObserve(self, username) subscribeNext:^(NSString *newName) {
    if ([newName isEqualToString:@"SomeString"])
    {
       //Do not observe any more
    }
}];
PS很抱歉显而易见的问题,但我找不到答案
我想要一个两个类的扩展UITextField,UITextView并且代码是相同的,但是我很难想出一个适用于它们的扩展.
我正在使用ReactiveCocoa,我现在有这个
import UIKit
import ReactiveCocoa
import enum Result.NoError
typealias NoError = Result.NoError
// How to DRY up this code?
extension UITextField {
  func textSignalProducer() -> SignalProducer<String, NoError> {
    return self.rac_textSignal()
      .toSignalProducer()
      .map { $0 as! String }
      .flatMapError { error in SignalProducer<String, NoError>(value:  "") }
  }
}
extension UITextView {
  func textSignalProducer() -> SignalProducer<String, NoError> {
    return self.rac_textSignal()
      .toSignalProducer()
      .map { $0 as! String }
      .flatMapError { error in SignalProducer<String, NoError>(value:  "") }
  }
} …reactive-cocoa ×10
ios ×8
objective-c ×6
swift ×4
carthage ×1
cocoa-touch ×1
frp ×1
mvvm ×1
raccommand ×1
rx-swift ×1