Objective c 命令行工具中的NSTimer

Objective c 命令行工具中的NSTimer,objective-c,concurrency,nstimer,core-bluetooth,command-line-tool,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

我开始了解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);
  }
}
因此,可能会从这里触发回调。如果回调包含一些调用停止计时器的库函数的逻辑,我不能保证失效是从哪个线程来的。那么如何正确地使计时器失效呢

我发现了一个问题,但它不允许一个main与计时器开启的run循环同时发生


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

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


这可以很简单,只需调用
[[nsrunlop currentlunloop]run]
main()
函数的末尾(请确保先安排启动工作,因为该方法永远不会返回)。

对于库的所有(包括非Mac)用户来说,这将是一个很大的范式转变。还有别的办法吗?NSTimer?@CodeSoda的一个很好的替代方案是,您必须将库隔离在主线程以外的线程中。关键是不要阻止GCD或nsrunlop正在使用的线程。这意味着,任何时候您想要使用库中的系统API时,您都会希望在库线程以外的其他线程中执行该操作。因此,我可以检查一下我想要如何执行该操作吗?1) 子类NSThead。1a)主要安排一个调用中间成员函数的计时器;然后运行当前运行循环。1b)在中间成员函数中,检查线程是否被取消。如果是,退出,否则重复调用我感兴趣的函数。2) 重复地开始做某事:分配、初始化和启动子类线程。3) 要停止重复这样做:取消线程。谢谢!我在尝试用AVFoundation导出视频时被卡住了,完成导出过程的完成回调没有被调用。在main.swift上添加dispatch_main()完全修复了它!
_centralManager=[[CBCentralManager alloc]
  initWithDelegate: self
  queue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
];