如何使异步任务(swift、ios)中的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

我有一个背景色的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)/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;