繁体   English   中英

命令行工具中的NSTimer

[英]NSTimer in 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)
];

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

我发现了这个问题,但是它不允许主程序与计时器所在的运行循环同时发生。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM