NSTimer在命令行工具中

时间:2014-01-10 22:49:56

标签: objective-c concurrency nstimer core-bluetooth command-line-tool

我开始了解并发的NS / Objective-C模型。假设我有一个命令行工具,可以执行以下操作:

#include "myLibrary.h"

void callback(void* parameter){
  cout<<"callback called.\n";
  //some logic...
}

int main(int argc, char* argv[]){
  myLibraryInit(callback);
  std::string s;
  while(true){
    cin>>s;
    myLibrarysResponseTo(s);
  }
}

在我的图书馆,我希望能有两个回复。一个启动重复计时器,一个停止它。计时器应该通过myLibraryInit调用提供给库的回调。

我之前在iPhone / iPad应用程序中使用过NSTimers,我认为问题源于不同的范例命令行工具。主线程进入main,直到程序完成后才会完成。这意味着它不能自由运行主运行循环,这是计时器的运行。我认为。那么如何在这种情况下使NSTimer工作呢?

另一件事是Apple NSTimer文档说我需要在安装它的同一线程上使NSTimer无效。我不知道如何在安装计时器时找出我所处的线程,然后跟踪它(并确保它保持活动状态),直到我想要使计时器无效。我不确定我是否只是错过了线程和调度队列,运行循环或其他东西之间的明显映射。我正在使用核心蓝牙,我像这样初始化一个中央管理器:

_centralManager=[[CBCentralManager alloc]
  initWithDelegate: self
  queue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
];

所以可以从这里触发回调。如果回调包含一些逻辑来调用停止计时器的库函数,我无法保证从哪个线程传来无效。那么如何才能使计时器无效?

我发现了this问题,但它不允许主要与计时器所在的运行循环同时发生。

我希望我给出了足够的背景。提前感谢您的回复。

1 个答案:

答案 0 :(得分:7)

如果[使用GCD或异步操作]的任何系统框架能够正常工作,您必须在主线程中调用dispatch_main()或运行NSRunLoop

这可以像在[[NSRunLoop currentRunLoop] run];函数末尾调用main()一样简单(只需确保首先安排启动工作,因为该方法永远不会返回)。