定时器
延长多长时间执行
1、perform
run循环源的执行回调。当源触发时,将调用此回调。
示例:
perform(#selector(toGuide), with: nil, afterDelay: 2)
@objc func toGuide(){
print("toGuide toGuide toGuide")
}
2、DispatchQueue
示例:
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
self.toGuide()
}
@objc func toGuide(){
print("toGuide toGuide toGuide")
}
在应用程序的主线程或后台线程中,串行或并发管理任务执行的对象。
分派队列是应用程序可以以块对象的形式向其提交任务的FIFO队列。
分派队列以串行或并发方式执行任务。提交给调度队列的工作在系统管理的线程池中执行。
除了代表应用程序主线程的调度队列外,系统不保证它使用哪个线程来执行任务。
您可以同步或异步地安排工作项。当您同步地安排一个工作项时,您的代码会一直等待,直到该项完成执行。当您异步调度工作项时,当工作项在其他地方运行时,您的代码将继续执行。
尝试在主队列上同步执行工作项会导致死锁。
避免过多的线程创建
**在设计并行执行的任务时,不要调用阻塞当前执行线程的方法。**当一个由并发调度队列调度的任务阻塞了一个线程时,系统创建额外的线程来运行其他排队的并发任务。
如果太多的任务阻塞,系统可能会耗尽应用程序的线程。应用程序消耗太多线程的另一种方式是创建太多私有并发调度队列。因为每个调度队列都会消耗线程资源,因此创建额外的并发调度队列会加剧线程消耗问题。
与其创建私有并发队列,不如将任务提交给全局并发调度队列之一。
对于串行任务,将串行队列的目标设置为全局并发队列之一。这样,您就可以维护队列的序列化行为,同时最小化创建线程的独立队列的数量。
计时器
每隔多长时间执行一次
Timer
Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(toGuide), userInfo: nil, repeats: true)
@objc func toGuide(){
print("toGuide toGuide toGuide")
}