如何在swift中实现优化的多个计时器?

时间:2017-05-26 11:49:34

标签: ios swift timer concurrency dispatch

我只是想知道什么是swift中内存优化多功能多时间器的最佳实现。 定时器并发并且在Dispatch中具有弱引用? 我试图在一个视图控制器中实现两个定时器,但我收到了一个错误。

我的一个计时器是这样的:

func startOnPlayingTimer() {

 let queue = DispatchQueue(label: "com.app.timer")
 onPlayTimer = DispatchSource.makeTimerSource(queue: queue)
 onPlayTimer!.scheduleRepeating(deadline: .now(), interval: .seconds(4))
 onPlayTimer!.setEventHandler { [weak self] in
   print("onPlayTimer has triggered")
 }
 onPlayTimer!.resume()   
}
另一个是:

 carouselTimer = Timer.scheduledTimer(timeInterval: 3, target: self,selector: #selector(scrollCarousel), userInfo: nil, repeats: true)

1 个答案:

答案 0 :(得分:0)

我认为任何应用程序都不需要多个计时器。 如果您从一开始就知道要触发哪种方法,请为每个需要触发的方法保留布尔值,并使用Int来保存方法的出现位置。您可以使用检查所需布尔值及其相应方法的方法调用计时器一次。

引用上述逻辑的伪代码如下:

  class ViewController: UIViewController {


var myTimer : Timer!

var methodOneBool : Bool!
var methodTwoBool : Bool!
var mainTimerOn : Bool!


var mainTimerLoop : Int!
var methodOneInvocation : Int!
var methodTwoInvocation : Int!

override func viewDidLoad() {
    super.viewDidLoad()
   configure()
}

func configure(){
    methodOneBool = false
    methodTwoBool = false

    methodOneInvocation = 5 // every 5 seconds
    methodTwoInvocation = 3 //every 3 seconds

    mainTimerOn = true // for disable and enable timer
    mainTimerLoop = 0 // count for timer main
}

func invokeTimer(){
    myTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(checkTimerMethod), userInfo: nil, repeats: true)
}


func checkTimerMethod(){

    if(mainTimerOn){

        if(mainTimerLoop % methodOneInvocation == 0 && methodOneBool){
            // perform first method
            // will only get inside this when
            // methodOneBool = true and every methodOneInvocation seconds
        }

        if(mainTimerLoop % methodTwoInvocation == 0 && methodTwoBool){
            // perform second method
            // will only get inside this when
            // methodTwoBool = true and every methodTwoInvocation seconds
        }

        mainTimerLoop = mainTimerLoop + 1

    }
 }

}

我希望这可以解决问题,如果我不理解你的要求请在下面评论,以便我可以相应地编辑答案