如何使异步任务(swift、ios)中的UIView无效
我有一个背景色的UIView如何使异步任务(swift、ios)中的UIView无效,ios,swift,dispatch-async,Ios,Swift,Dispatch Async,我有一个背景色的UIView @IBOutlet var timelineview:timelineview 现在我想用一个异步任务更改UIView的背景色,该任务应该每秒更改UIView的背景色 dispatch_async(dispatch_get_main_queue()) { for var i=10;i<100;i++ { println(i); var iRed:CGFloat=CGFloat(i)/CGF
@IBOutlet var timelineview:timelineview代码>
现在我想用一个异步任务更改UIView
的背景色,该任务应该每秒更改UIView
的背景色
dispatch_async(dispatch_get_main_queue()) {
for var i=10;i<100;i++ {
println(i);
var iRed:CGFloat=CGFloat(i)/CGFloat(10.0);
var backgroundColor:UIColor=UIColor(red: iRed, green: iRed, blue: iRed, alpha: 0.5);
self.timelineview.backgroundColor = backgroundColor;
sleep(1);
}
}
dispatch\u async(dispatch\u get\u main\u queue()){
对于var i=10;i除非您已经覆盖了视图的行为,否则设置backgroundColor
也会告诉视图它需要重新显示。如果您发现它不工作(应该),您可以使用
self.timelineview.setNeedsDisplay()
旁注:永远不要在主队列中调用sleep
看起来你希望它每秒都不断更新它的颜色。这个循环不应该存在于主队列中,但是内容可能存在于它上。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
for var i=10;i<100;i++ {
println(i);
var iRed:CGFloat=CGFloat(i)/CGFloat(10.0);
var backgroundColor:UIColor=UIColor(red: iRed, green: iRed, blue: iRed, alpha: 0.5);
dispatch_async(dispatch_get_main_queue())) {
self.timelineview.backgroundColor = backgroundColor;
}
sleep(1);
}
}
dispatch\u async(dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u DEFAULT,0)){
对于var i=10;i您实际查找的不是调度队列,而是可以使用GCD的dispatch\u source\u create
方法创建的计时器,如下所示:
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main-queue());
//start timer
if (timer) {
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, interval * NSEC_PER_SEC, 0.0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
// set background color or any other UI code here
});
dispatch_resume(timer);
}
interval
是计时器启动的时间间隔,以秒为单位(1.0)
要停止计时器,请使用:
dispatch_source_cancel(timer);
timer = NULL;
很抱歉,我是一个普通的Objective C老家伙,对Swift不太熟悉。但你可能会明白这个概念。你可以使用NSTimer
而不是dispatch\u async
/sleep
。非常感谢你的解释。这很有希望。我会检查一下。伊恩·麦克唐纳的回答很好,我已经读过了y查对了。所以我现在不确定谁会接受这个答案:-)@user1344545我可以理解这个困境。但我应该建议你至少有一件事,就像伊恩·麦克唐纳在他的答案中提到的那样,避免在你的代码中调用sleep
,除非你没有任何其他方法来执行相同的功能。对于你根据你的要求,定时器是一个非常理想的解决方案。如果你觉得更吸引人,你也可以使用NSTimer
。非常感谢!这很有帮助。我测试过,效果很好。很明显,这不是一个好的设计,因为你也参与了,我也会检查Ayan的答案。所以我不确定现在谁会接受答案t:-)投了赞成票,因为它回答了我的问题,但阿扬的答案更合适。非常感谢你的帮助。
dispatch_source_cancel(timer);
timer = NULL;