NSTimer在命令行工具中

 西红柿 发布于 2023-02-04 15:19

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

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

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

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

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

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

    2023-02-04 15:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有