5
私はスライドブロックでゲームを書いています。解決した状態からゲームをシャッフルするために、定期的にpushRandomPiece
を繰り返し呼び出して、ゲームを視覚的にシャッフルします。dispatch_after対performSelector afterDelay
私は最初の場所でdispatch_after使用していたが、私は、発射日付に問題がある:
これは動作します:
-(void)shuffle {
for (int i=0; i<50;i++)
[self performSelector:@selector(pushRandomPiece) withObject:nil afterDelay:i*0.50*2];
}
pushRandomPieceにおける二つの連続通話との差がほとんど常に等しいです一秒。
しかし、これは動作しません。ここで
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
作る方法は、ブロックが移動されています:ここで
-(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]; });
}
は、連続したコール間の時間差がある
-(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];
});
}
グランドセントラルディスパッチを使用して、特定の日付にブロックの実行をスケジュールする方法はありますか? – alecail
@AntoineLecailleあなたはメインループ(それは低周波数です)で単一の繰り返しNSTimerを考慮する必要があります。あなたはディスパッチソースとタイマー( 'dispatch_source_create' +' dispatch_source_set_timer')を使ってlibdispatchを使うことができます。私はこの場合はしません。 – justin
@justinだから、** dispatch_after **は** performSelector **とどう違うのですか? – onmyway133