标签: reactive-cocoa

将RAC命令与异步网络操作一起使用

我正在使用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);
}];
Run Code Online (Sandbox Code Playgroud)

但是设置命令对我来说是一个谜:

self.gitHubCommand = [RACCommand command];

self.gitHubSignal = [self.gitHubCommand addSignalBlock:^RACSignal *(id value) {
    RACSignal *signal = ???

    return signal;
}];
Run Code Online (Sandbox Code Playgroud)

当某些异步网络调用返回时,如何设置信号块以返回推送事件的信号?

objective-c ios reactive-cocoa raccommand

7
推荐指数
1
解决办法
1454
查看次数

使用ReactiveCocoa时未调用错误块

出于某种原因,我没有收到错误消息.(我在这里简化了代码以直截了当.)

// 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");
    }];
}];
Run Code Online (Sandbox Code Playgroud)

这打印"B".知道为什么吗?如果-sendError:在订户上调用,为什么完成块会收到它?

objective-c ios reactive-cocoa

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

仪器RACSignal的最佳实践

我的任务是为应用程序添加一些检测逻辑,以跟踪各种API调用的延迟.我正在努力想出一种干净的,无副作用的方法来为返回RACSignal(延迟执行API调用)的方法添加时序检测.

注意事项

  • 使用ReactiveCocoa @ 1.9.5(目前无法升级)
  • 使用Parse-RACExtensions @ 0.0.2
  • 我宁愿在ViewModel层设置时序,而不是修改Parse-RACExtensions.这是因为VM有我想记录的额外信息,比如查询参数,而且我不需要每个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
Run Code Online (Sandbox Code Playgroud)

用法如下所示:

- (RACSignal*)saveFoo:(Foo*)fooParseObj {
    RACSignal *save = [[fooParseObj rac_save] replay]; // Don't forget replay!
    [save subscribe:[[SignalTimer alloc] initWithName@"Saving the user's foo …
Run Code Online (Sandbox Code Playgroud)

objective-c reactive-programming ios reactive-cocoa

7
推荐指数
1
解决办法
526
查看次数

rac_signalForSelector:需要空实现

我有一个实现UICollectionViewDelegate协议的类.

我正在使用rac_signalForSelector:来注册这样的选择:

[self rac_signalForSelector:@selector(collectionView:didSelectItemAtIndexPath:)]
Run Code Online (Sandbox Code Playgroud)

但是只有在我离开collectionView的一个空实现时才会触发:didSelectItemAtIndexPath:这样:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    // Empty
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用rac_signalForSelector:fromProtocol:也没有运气.

我正在使用Reactive Cocoa 2.2.4

谢谢,Mikkel

objective-c ios reactive-cocoa

7
推荐指数
1
解决办法
1506
查看次数

可以/我应该如何用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
查看次数

为什么SignalProducer不返回信号?

我觉得我理解ReactiveCocoa的所有基本组件(从概念上讲),通过了解如何将所有组件连接在一起仍然有点令人困惑.

例如,在阅读了有关Signal之后,我完全希望SignalProducer只有一个start()方法返回一个Signal,你可以这样使用它:

mySignalProducer.start().observe(myObserver)
Run Code Online (Sandbox Code Playgroud)

相反,你必须将观察者传递给start(),SignalProducer为你调用observe():

mySignalProducer.start(myObserver)
Run Code Online (Sandbox Code Playgroud)

这意味着SignalProducer的接口要大得多(更需要理解),因为observe()的所有变量都必须在start()上重复(例如startNext()等).

我认为这里有两种可能性:

  1. 有技术原因,为什么start()不能简单地返回一个信号
  2. 我在概念上误解了SignalProducer,导致对其界面的不满

如果是1,我猜这与内存管理和一次性用品有关,我还不完全了解.

我更担心2是这样的.在内部,我对SignalProducer的理解基本上映射到Factory的概念,例如:

mySignalFactory.createSignal().observe(myObserver)
Run Code Online (Sandbox Code Playgroud)

这就是为什么我很惊讶我们没有找到返回Signal的start().

如果社区可以在这里阐明一点,我将非常感激.

谢谢!

ios reactive-cocoa swift reactive-cocoa-4

7
推荐指数
1
解决办法
1892
查看次数

RxSwift正确的方式

我正在尝试使用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");
}];
Run Code Online (Sandbox Code Playgroud)

我的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 > …
Run Code Online (Sandbox Code Playgroud)

mvvm frp reactive-cocoa swift rx-swift

7
推荐指数
1
解决办法
2800
查看次数

没有订阅者时停止发布,有订阅者时自动启动

如果RACSignal没有订阅者,我将如何实现停止发布?如果有订阅者则自动启动?

这是一个场景:

让我们说我有一个currentLocationSignalAppDelegate.当视图卸载时,我LocationViewController会订阅currentLocationSignal视图加载和取消订阅(dispose).由于获取当前位置需要几秒钟,我希望始终订阅currentLocationSignal应用程序打开的时间(并在几秒钟后自动取消订阅),所以当我到达时,LocationViewController我会得到一个准确的位置.因此,信号可能有多个订户.当第一个用户收听时,它需要开始呼叫startUpdatingLocation,当没有用户需要呼叫时stopUpdatingLocation.

cocoa-touch objective-c reactive-programming ios reactive-cocoa

6
推荐指数
1
解决办法
1085
查看次数

如何使用ReactiveCocoa删除观察者?

某些事件后如何停止接收新名字?

[RACObserve(self, username) subscribeNext:^(NSString *newName) {
    if ([newName isEqualToString:@"SomeString"])
    {
       //Do not observe any more
    }
}];
Run Code Online (Sandbox Code Playgroud)

PS很抱歉显而易见的问题,但我找不到答案

objective-c ios reactive-cocoa

6
推荐指数
2
解决办法
2887
查看次数

Swift扩展子句在哪里或那个

我想要一个两个类的扩展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:  "") }
  }
} …
Run Code Online (Sandbox Code Playgroud)

ios reactive-cocoa swift

6
推荐指数
1
解决办法
766
查看次数