如何使用Swift在自定义线程中运行Timer

问题描述

我必须完成一个简单的任务-具有两个按钮和三个踏板的Singleview应用-

  1. 开始按钮:

1a)创建线程T1-每3.0重复收集一次设备的GPS位置 秒,然后将结果(作为字符串)移交给T3。

1b)创建w线程T2-收集设备电池的使用百分比 每B秒重复一次,并将结果(作为字符串)移交给T3。

1c)在线程T3中,应将来自T1和T2的数据存储在数组中,并在x数据多的情况下执行操作。

  1. 停止按钮-只需停止所有三个线程

我对iOS线程一无所知。

  1. 您如何看待,我该怎么用-DCG,例如:DCG embed in DispatchWorkItem

  2. 我应该在ViewController中创建线程吗?还是我应该在模型部分中构建某种线程管理器?

  3. 如何在线程之间进行通信-我应该在T3中创建一种侦听器吗?

  4. 现在我有这样的东西,但是它不起作用。

    DECLARE @cnt INT = 2018; --if 2018 is start year
    
    WHILE @cnt < 2020  --if 2020 is ending year
    BEGIN
    --hear check how many meeting he did based on your database
    SET @cnt = @cnt + 1;
    END;
    

为什么线程启动后什么也没打印?

请问这4个问题,并给我任何建议(出了什么问题),更笼统地说-我该怎么做?

解决方法

对该问题的简短回答是“不要以这种方式使用Thread”。 (非常轻微)更长的答案是,Timer依赖RunLoops,并且您创建了一个没有RunLoop的线程,并且在创建线程后就立即销毁了它。但是无论如何,您都不应该这样使用Thread。实际上,您几乎不应该在iOS开发中使用Thread。

您描述的问题不需要这样的东西。但是,如果您发现确实需要线程的地方,请先阅读Apple的Migrating Away From Threads

如果最后您确实确实需要一个Thread,那么您需要研究Thread的文档。此处几乎每一行代码都是错误的,因此,首先阅读文档然后提出一个新问题,而不是全部纠正它们。这不是启动线程的方式,不是停止线程的方式,也不是定时器的工作方式。 (该API并不明显,所以我理解您为什么用这种方式编写它。这根本不是您想要的。)

仅通过响应位置管理器的委托回调来处理您所描述的位置更新方法。如果您真的需要定期检查,则只需使用标准计时器。不需要DispatchQueues,Threads或其他任何东西。计时器完成所有工作(它使用RunLoop)。

类似地,不应使用计时器来监视电池。您要打开UIDevice.isBatteryMonitoringEnabled,然后收听通知。如果您需要轮询,那么再次需要一个简单的计时器。

只要情况允许,您都希望系统在发生变化时给您打电话。如果发现自己在轮询某些内容,则通常是在做错了事。但是当您确实需要轮询时,Timer是最常见和最简单的工具。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...