2016-05-14 60 views
1

我有一个显示自定义不确定进度指示器的类。每个计时器更新它只需使用CGAffineTransformRotate递增UIImageView的旋转。更好的替代基于计时器的自定义活动指标的动画?

但是,这一切都有效,我注意到它在运行时,它正在等待的后台进程运行速度降低了50% - 这是一个巨大的惩罚。例如;而不是说20秒完成处理需要30秒。有人可以推荐性能较低的解决方案吗?

func show() { 
    timer?.invalidate() 
    timer = NSTimer.scheduledTimerWithTimeInterval(0.03, target: self, selector: #selector(self.updateTimer(_:)), userInfo: nil, repeats: true) 
} 

func updateTimer(sender: NSTimer) { 
    iconView.transform = CGAffineTransformRotate(iconView.transform, 0.15) 
} 
+1

你真的需要33帧/秒吗? – rmaddy

+1

这是什么图像?你可以使用核心动画?你可以使用视频吗? – jtbandes

+1

另外,仪器在哪里说CPU正在用掉? – jtbandes

回答

1

使用的Core Animation动画旋转。窗口服务器将完成应用程序进程之外的所有工作。

let animation = CABasicAnimation(keyPath: "transform.rotation") 
animation.fromValue = 0 
animation.toValue = 2 * M_PI 
animation.repeatCount = .infinity 
animation.duration = 1.25 
iconView.layer.addAnimation(animation, forKey: animation.keyPath) 
+0

谢谢你的男人! –

0

我认为你可以使用dispatch_source从@罗布的回答是:

Do something every x minutes in Swift

下面是代码:

var timer: dispatch_source_t! 

func startTimer() { 
    let queue = dispatch_queue_create("com.domain.app.timer", nil) 
    timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue) 
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 60 * NSEC_PER_SEC, 1 * NSEC_PER_SEC) // every 60 seconds, with leeway of 1 second 
    dispatch_source_set_event_handler(timer) { 
     // do whatever you want here 
    } 
    dispatch_resume(timer) 
} 

func stopTimer() { 
    dispatch_source_cancel(timer) 
    timer = nil 
}