出于学习目的,我正在OSX 上构建一个可视化编程应用程序。基本上它由一个功能节点组成,通过输出 -> 输入连接并形成一个图。
我正在使用深度优先搜索构建连接图(使用CoreData),然后在图队列中执行每个节点:
NSTimeInterval secondsToFire = 1./250.;
NSString *dispatchName = [NSString stringWithFormat:@"info.oz432.timer.queue.%p", self];
dispatch_queue_t queue = dispatch_queue_create([dispatchName UTF8String], 0);
_timer = [self createWithInterval:secondsToFire inQueue:queue usingBlock:^{
for (NSManagedObject *node in pipeline) {
[self executeNode:[node objectID] inQueue:queue];
}
}];
和-createWithInterval:inQueue:usingBlock:
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
if (timer) {
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval * NSEC_PER_SEC, interval * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, block);
dispatch_resume(timer);
}
return timer;
它现在工作得很好,但我想知道:
- 如果使用ReactiveCocoa将信号从输出连接到输入将是一种最简单/更易读/性能更高的解决方案;
- 否则,我为什么要选择为我的每个 'pipelines' 运行一个 NSRunLoop。
我已经阅读了很多关于NSRunLoop的内容,我可以看到参与 ie 的人。Cocoa 中的 GStreamer 使用 NSRunLoop 进行管理,而 Vuo正在使用它。我想我了解它的基本原理。但我不明白,这是我的问题:它有什么好处?