dispatch_after与performSelector afterDelay [英] dispatch_after versus performSelector afterDelay

查看:184
本文介绍了dispatch_after与performSelector afterDelay的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在写一个带有滑块的游戏.为了使游戏从已解决状态开始随机播放,我想以固定的时间间隔反复调用pushRandomPiece以便从视觉上对游戏进行随机播放.

I am writing a game with sliding blocks. In order to shuffle the game from the solved state, I would like to repeatedly call pushRandomPiece at regular interval to visually shuffle the game.

我本来想使用dispatch_after,但是我对启动日期有疑问:

I wanted to use dispatch_after in the first place but I have a problem with the firing date:

这有效:

-(void)shuffle {
    for (int i=0; i<50;i++)
    [self performSelector:@selector(pushRandomPiece) withObject:nil afterDelay:i*0.50*2];
}

pushRandomPiece中两个连续调用之间的差值几乎恒定等于一秒.

The difference between two consecutive calls in pushRandomPiece is almost constantly equal to one second.

但这不起作用:

-(void)shuffle {
    for (int i=0; i<50;i++)
//        [self performSelector:@selector(pushRandomPiece) withObject:nil afterDelay:i*0.50*2];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, i*NSEC_PER_SEC*0.5*2), dispatch_get_main_queue(), ^{ [self pushRandomPiece]; });
}

这是连续通话之间的时差:

Here is the time difference between consecutive calls:

2013-10-01 11:02:53.147 SlidingPuzzle[2006:60b] diff= 1.077376
2013-10-01 11:02:54.262 SlidingPuzzle[2006:60b] diff= 1.111863
2013-10-01 11:02:55.335 SlidingPuzzle[2006:60b] diff= 1.070456
2013-10-01 11:02:56.455 SlidingPuzzle[2006:60b] diff= 1.117381
2013-10-01 11:02:57.542 SlidingPuzzle[2006:60b] diff= 1.084070
2013-10-01 11:02:58.655 SlidingPuzzle[2006:60b] diff= 1.110574
2013-10-01 11:02:59.757 SlidingPuzzle[2006:60b] diff= 1.098654
2013-10-01 11:03:00.862 SlidingPuzzle[2006:60b] diff= 1.103132
2013-10-01 11:03:01.956 SlidingPuzzle[2006:60b] diff= 1.091535
2013-10-01 11:03:03.050 SlidingPuzzle[2006:60b] diff= 1.090532
2013-10-01 11:03:04.160 SlidingPuzzle[2006:60b] diff= 1.107981
2013-10-01 11:03:04.164 SlidingPuzzle[2006:60b] diff= 0.000982
2013-10-01 11:03:06.354 SlidingPuzzle[2006:60b] diff= 2.187945
2013-10-01 11:03:06.357 SlidingPuzzle[2006:60b] diff= 0.000862
2013-10-01 11:03:08.498 SlidingPuzzle[2006:60b] diff= 2.139442
2013-10-01 11:03:08.501 SlidingPuzzle[2006:60b] diff= 0.000805
2013-10-01 11:03:10.750 SlidingPuzzle[2006:60b] diff= 2.246749
2013-10-01 11:03:10.753 SlidingPuzzle[2006:60b] diff= 0.000839

以下是使块移动的方法:

Here is the method that makes the blocks move:

-(void) pushRandomPiece {
    NSSet * s = [self freeBlocks];
    int n = [s count];
    int piece = arc4random_uniform(n);
    Piece * p = [[s allObjects] objectAtIndex:piece];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self pushPiece:p];
    });
}

推荐答案

dispatch_after仅在指定时间之后将您的块添加到队列中.如果队列为空,则您的块可能会在添加到队列后立即运行.否则,它可能会在队列中运行一段时间,然后等待其他任务完成.

dispatch_after only adds your block to the queue after the time you have specified. If the queue is empty, your block may be run immediately upon being added to the queue. Otherwise, it may sit in the queue for some time before running -- waiting for other tasks to finish.

这篇关于dispatch_after与performSelector afterDelay的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆