我开始了解并发的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];
在main()
函数结束时调用一样简单(只需确保首先安排启动工作,因为该方法永远不会返回).