2

我开始了解 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)
];

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

我发现了这个问题,但它不允许 main 与计时器打开的运行循环同时发生。

我希望我提供了足够的背景信息。提前感谢您的回复。

4

1 回答 1

7

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

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

于 2014-01-10T22:57:46.520 回答