JavaScript 和本地代码之间的跨平台反应通信通道
使用 ReactiveCocoa 构建 UI 并使用 JavaScript 作为跨平台业务逻辑核心,利用反应信号来解决问题,这不是很酷吗?
Kaare 还通过使本地和 JS 代码之间的通信也变得反应式,让一切都变得更加出色。
Kaare 将处理从一种上下文到另一种上下文的全部双向通信
-(void)testExampleFromReadme
{
__block NSString* output = @"";
Kaare* kaare = [[Kaare alloc] initWithTransport:[[KaareJSCoreTransport alloc] initWithContextFinder:^JSContext *{
// Here you can define how your JS context can be found
return [self getContextForTestAndEvaluate:@[@"var getString = function(){ return 'Hello' }",
@"var splitString = function(str) { return Rx.Observable.fromArray(str.split('')) }"]];
}]];
[[[kaare executeCommand:@"getString" params:nil]
flattenMap:^RACStream *(id value) { return [kaare executeCommand:@"splitString" params:@[value]]; }]
subscribeNext:^(id x) { output = [output stringByAppendingString:x]; }
completed:^{ isDone = YES; XCTAssertEqualObjects(output,@"Hello",@"There should be right output");
}];
}
-(void)testReturnSignalWithNumber
{
Kaare* kaare = [[Kaare alloc] initWithTransport:[[KaareJSCoreTransport alloc] initWithContextFinder:^JSContext *{
return [self getContextForTestAndEvaluate:@[@"var forwarder = new kaare.Forwarder()"]];
}]];
[kaare registerCommand:@"number" handler:^RACSignal* (NSArray *params) { return [RACSignal return:@(42)]; }];
[context evaluateScript:[NSString stringWithFormat:@"forwarder.executeCommand('number').subscribe(function(v){ output = v*2 },null,function(){ done() })"]];
NSNumber* output = [[context evaluateScript:@"output"] toNumber];
XCTAssertEqual([output intValue], 84,@"There should be right number");
}
Kaare 可以很容易地通过新处理程序进行扩展。例如,Kaare Platform 引入了一些可能对您的 JS 有用的原生 API 函数。
var app = {}
app.kaare = new Kaare(new KaareNativeTransport())
app.platform = new KaarePlatform(kaare)
app.platform.httpRequest('http://google.com')
.map(function(response) { return response.body })
.map(function(body) { return app.platform.xPath(body,'//input/@value') })
.map(function(inputValue) { return 'Found name with value: ' + inputValue })
.subscribe(function(logEntry) { console.log(logEntry) })
Kaare 支持不同类型的传输,以便支持不同的 JS 执行上下文(JavaScriptCore、UIWebView)。其中一种传输允许 JS 和本地代码之间的远程通信,这对开发非常方便。
shell: vagrant up
将启动 redis 和 webdis
JS: var kaare = new Kaare(new KaareRemoteTransport('http://vagrantHost:7656'))
Obj-C: Kaare* kaare = [[Kaare alloc] initWithTransport:[[KaareRemoteTransport alloc] initWithOptions:@{@"url":@"http://vagrantHost:7656"}]
从现在起,您可以使用您喜欢的 OS 和工具(如 mocha、gulp 等)开发所有 JS 代码,同时使用 OS 的原生 API,无需模拟,无需更改代码。
KaarePlatform* platform = [[KaarePlatform alloc] initWithKaare:kaare]