- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在编写一些通过 websockets 与远程 API 交互的代码。我的数据层负责建立和监控 websocket 连接。它还包含应用程序可以用来对要发送的 websocket 消息进行排队的方法。应用程序代码不应该负责检查 websocket 连接的状态,也就是即发即弃。
理想情况下,我希望数据层的功能如下:
self.isConnected == NO
),消息在内部缓冲。self.isConnected == YES
),缓冲消息会立即发送,任何后续消息也会立即发送。这是我能够想出的:
#import "RACSignal+Buffering.h"
@implementation RACSignal (Buffering)
- (RACSignal*)bufferWithSignal:(RACSignal*)shouldBuffer
{
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
NSMutableArray* bufferedValues = [[NSMutableArray alloc] init];
__block BOOL buffering = NO;
void (^bufferHandler)() = ^{
if (!buffering)
{
for (id val in bufferedValues)
{
[subscriber sendNext:val];
}
[bufferedValues removeAllObjects];
}
};
RACDisposable* bufferDisposable = [shouldBuffer subscribeNext:^(NSNumber* shouldBuffer) {
buffering = shouldBuffer.boolValue;
bufferHandler();
}];
if (bufferDisposable)
{
[disposable addDisposable:bufferDisposable];
}
RACDisposable* valueDisposable = [self subscribeNext:^(id x) {
[bufferedValues addObject:x];
bufferHandler();
} error:^(NSError *error) {
[subscriber sendError:error];
} completed:^{
[subscriber sendCompleted];
}];
if (valueDisposable)
{
[disposable addDisposable:valueDisposable];
}
return disposable;
}];
}
@end
最后,这是关于如何使用它的伪代码:
@interface APIManager ()
@property (nonatomic) RACSubject* requests;
@end
@implementation WebsocketDataLayer
- (id)init
{
self = [super init];
if (self) {
RACSignal* connectedSignal = RACObserve(self, connected);
self.requests = [[RACSubject alloc] init];
RACSignal* bufferedApiRequests = [self.requests bufferWithSignal:connectedSignal];
[self rac_liftSelector:@selector(sendRequest:) withSignalsFromArray:@[bufferedApiRequests]];
}
return self;
}
- (void)enqueueRequest:(NSString*)request
{
[self.requests sendNext:request];
}
- (void)sendRequest:(NSString*)request
{
DebugLog(@"Making websocket request: %@", request);
}
@end
我的问题是:这是缓冲值的正确方法吗?是否有更惯用的 RAC 方式来处理这个问题?
最佳答案
缓冲可以被认为是应用于个别请求的东西,这导致使用-flattenMap:
和RACObserve
的自然实现:
@weakify(self);
RACSignal *bufferedRequests = [self.requests flattenMap:^(NSString *request) {
@strongify(self);
// Waits for self.connected to be YES, or checks that it already is,
// then forwards the request.
return [[[[RACObserve(self, connected)
ignore:@NO]
take:1]
// Replace the property value with our request.
mapReplace:request];
}];
如果顺序很重要,您可以将 -flattenMap:
替换为 -map:
加上 -concat
。这些实现避免了对任何自定义运算符的需要,并且无需手动订阅(这是出了名的困惑)。
关于ios - 如何有条件地缓冲 RACSignal 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19525160/
例如,我目前的实现如下: - (RACSignal *)getPlaylist { return [RACSignal createSignal:^RACDisposable *(id subsc
使用 ReactiveCocoa,我确定有比这更好的方法吗? RACSignal *crashSignal = [cancelSignal tryMap:^id(id value, NSError *
rac_textSignal-Implementation使用“defer”在“self”上返回 RACSignal。这是什么原因? 这是实现: - (RACSignal *)rac_textSign
我有一个简单的 subscribeNext: error: 链,如: [[self.viewModel signal] subscribeNext:^(id x) { NSLog(@"succ
我已将一些 racsignals 合并为一个 Racsignal。并订阅合并信号。现在,如果我合并的任何信号发送错误事件,所有合并的信号都会被处理掉。如果任何信号失败,我希望所有信号继续执行。 最佳答
我有一个属性,recording,如果 UILongPressGestureRecognizer 处于状态 UIGestureRecognizerStateBegan 或UIGestureRecogn
我目前正在开发 WatchKit 应用程序,但我目前遇到此给定方法的问题: - (void)application:(UIApplication*)application handleWatchKit
我正在尝试使用 ReactiveCocoa 的 RACSignal 类的间隔方法。以下代码在 1 秒后每秒运行一次。但我希望它每秒都能立即运行。什么是最好的方法? @weakify(self); [[
我有一个简单的问题,但找不到好的解决方案。 我有一个发送字符串的信号,然后是一个 map。 map 将字符串转换为 JSON。 可能会出现字符串格式错误导致JSON解析器解析失败的情况。 [strin
我是 Reactive Cocoa 的新手。我正在尝试通过信号设置按钮启用属性。我有以下代码片段可以正常工作: RACSignal *formValid = [RACSignal
我的 ViewController 包含一个 UISearchBar 并实现了 UISearchBarDelegate 协议(protocol)。我为 searchBartextDidChange:
我也在我的 iOS 中使用 MVVM 范例和 RACSignal。到目前为止,一切进展顺利。但是,我在订阅信号时遇到了问题。在第一次订阅时一切正常。但是,进一步的订阅不会。 代码 在我的 viewMo
我正在尝试使用 react 性 cocoa 进行并发加载,我的实现使用了已弃用的缓冲方法。我如何才能在不损失代码清晰度的情况下更改它? 输入:仅发送一次“下一步”并完成/错误的加载信号数组 期望的结果
我对 ReactiveCocoa 比较陌生,想知道如何将一系列 REST GET 调用链接在一起,以便它们按顺序执行。如果其中一个调用出错,则整个过程将回滚。 所以我正在使用 pod 'AFNetwo
例如: 在一个 Controller 中实现 func sendSuccessOrNot()->RACSignal { // code here } 在另一个 Controller 中,调用那个信号
我目前正在迈出 ReactiveCocoa 的第一步,我经历了一些陡峭的学习曲线来理解原则。 无论如何,这就是我已经想到的。 我将 NSArray 属性绑定(bind)到 RACSignal,以便能够
我的任务是向应用添加一些检测逻辑以跟踪各种 API 调用的延迟。我正在努力想出一种干净、无副作用的方法来向返回 RACSignal(延迟执行 API 调用)的方法添加计时检测。 注意事项 使用 Rea
我正在编写一些通过 websockets 与远程 API 交互的代码。我的数据层负责建立和监控 websocket 连接。它还包含应用程序可以用来对要发送的 websocket 消息进行排队的方法。应
我正在尝试返回一个可以在 Objective-C 代码中使用的 RACSignal,我尝试了各种方法。例如: @objc class func getPosts() -> RACSignal
我正在尝试监听位置更新和错误(通过 CLLocationManagerDelegate),并支持跟踪错误但将它们从最终信号中过滤掉并保持其事件的能力。 当我订阅位置信号时(通过 ReactiveCoc
我是一名优秀的程序员,十分优秀!