2013-10-01 11 views
5

Kaydırma blokları olan bir oyun yazıyorum. Oyunu çözülmüş haliyle karıştırmak için, oyunu görsel olarak karıştırmak için tekrar tekrar pushRandomPiece numaralı telefonu arayacağım. dispatch_after versusSelector afterDelay

ben ilk etapta dispatch_after kullanmak istedi ama ateşleme tarih ile ilgili bir sorun vardır:

Bu çalışır:

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

pushRandomPiece iki ardışık aramalar arasındaki fark sürekli neredeyse eşittir bir saniye.

Ama bu işe yaramazsa: Burada

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 

yapar yöntem blokları hareket edilir: Burada

-(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]; }); 
} 

ardışık aramalar arasındaki zaman farkıdır

-(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]; 
    }); 
} 

cevap

4

dispatch_after, yalnızca belirttiğiniz süreden sonra bloğunuzu sıraya ekler. Sıra boşsa, bloğunuz kuyruğa eklendikten hemen sonra çalıştırılabilir. Aksi takdirde, koşmadan önce bir süre kuyrukta oturabilir - diğer görevlerin bitmesini bekleyebilir.

+0

Belirli bir tarihte bir bloğun yürütülmesini zamanlamak için büyük merkezi gönderim kullanarak bir yol var mı? – alecail

+0

@AntoineLecaille, ana çalışma döngüsünde tek bir yinelenen 'NSTimer' düşünün (düşük frekanslı). sen * bir gönderim kaynağı ve zamanlayıcı ('dispatch_source_create' +' dispatch_source_set_timer') kullanarak libdispatch kullanabilir. Bu durumda olmaz. – justin

+0

@justin nasıl ** dispatch_after **, ** performSelector ** 'dan farklı? – onmyway133

İlgili konular