2013-03-17 10 views
5

onun tarafından oluşturulan sıraları duraklatma ve müzik karartmak için. Sorun, diğer parçacıkların/kuyrukların müziği duraklatabilmesidir, yani içerideki ve dışarıdaki solgunluğun sadece duraklatmak değil, aynı zamanda beklemede kalması gerekir. Bir dispatch_after üzerindeki "timer" ı duraklatabilmem gerekiyor (çünkü müzik çalmaya ne zaman başlayacağını söylemek için müzik çalmaya başlıyor, duraklatılmışsa gecikmeli olması gerekiyor) ve bir sıra duraklatılıyornasıl bir dispatch_queue_t ve ben, başka şeyler aramızda bir program kuruyorum

- (void) doFadeIn: (float) incriment to: (int) volume with: (AVAudioPlayer*) thisplayer on: (dispatch_queue_t) queue{ 
    dispatch_async(queue, ^{ 
     double delayInSeconds = .1; 
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
     dispatch_after(popTime, queue, ^(void){ 
      thisplayer.volume = (thisplayer.volume + incriment) < volume ? thisplayer.volume + incriment : volume; 
      NSLog([[[NSNumber alloc] initWithFloat:thisplayer.volume] stringValue]); 
      if (thisplayer.volume < volume) { 
       [self doFadeIn:incriment to:volume with:thisplayer on:queue]; 
      } 
     }); 
    });  
} 

-(void) doDelayFadeOut: (float) incriment with: (AVAudioPlayer*) thisplayer on: (dispatch_queue_t) queue 
{ 
    dispatch_async(queue, ^{ 
     double delayInSeconds = .1; 
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
     dispatch_after(popTime, queue, ^(void){ 
      thisplayer.volume = (thisplayer.volume - incriment) > 0 ? thisplayer.volume - incriment : 0; 
      NSLog([[[NSNumber alloc] initWithFloat:thisplayer.volume] stringValue]); 
      if (thisplayer.volume > 0.0) { 
       [self doDelayFadeOut:incriment with:thisplayer on:queue]; 
      } 
     }); 
    }); 
} 

-(void) fadeIn: (AVAudioPlayer*) dFade { 
    if (dFade == nil) { 
     return; 
    } 
    dispatch_queue_t queue = dispatch_queue_create("com.cue.MainFade", NULL); 
    dispatch_async(queue, ^(void){ 
     if(dFade !=nil){ 
      double incriment = ([self relativeVolume]/[self fadeIn])/10; //incriment per .1 seconds. 
      [self doFadeIn: incriment to: [self relativeVolume] with:dFade on:dispatch_queue_create("com.cue.MainFade", 0)]; 
     } 

    }); 
} 

- (void) delayFadeOut: (AVAudioPlayer*) dFade { //d-fade should be independent of other threads 
    if (dFade == nil) { 
     return; 
    } 
    int timeRun = self.duration - self.fadeOut; 
    dispatch_queue_t queue = dispatch_queue_create("com.cue.MainFade", NULL); 
    dispatch_time_t mainPopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeRun * NSEC_PER_SEC)); 
    printf("test"); 
    dispatch_after(mainPopTime, queue, ^(void){ 
     if(dFade !=nil){ 
      double incriment = ([dFade volume]/[self fadeOut])/10; //incriment per .1 seconds. 
      [self doDelayFadeOut:incriment with:dFade on:dispatch_queue_create("com.cue.MainFade", 0)]; 
     } 

    }); 
    if (self.cueType == 2) { 
     [self callNext]; 
    } 
} 

cevap

9

, çağrı (dispatch_resume() birlikte) dispatch_suspend() olduğunu. Bu, belirli bir sıradaki yeni blokların programlanmasını engeller. Zaten çalışan bloklarda herhangi bir etkisi olmayacaktır. Daha önceden planlanmış ve çalıştırılan bir bloğu duraklatmak isterseniz, koşullu ve duraklatmak için kodunuza kalmış demektir.

Bunu kullanırken anlamanın anahtarı, "dispatch_after öğesinde" zamanlayıcıyı duraklatabilecek hiçbir şey olmamasıdır. " 1 saniye sonra gönderilecek bir şey istediğinizi söylerseniz, kesinlikle 1 saniye sonra gönderilir. Fakat "sevk", "koşmak" anlamına gelmez. "Sıraya koy" anlamına gelir. Bu sıra askıya alınırsa, sıraya devam edilene kadar blok kapanır. Dikkatli olmanız gereken şey, bir grup soluk blokun kuyrukta birikmesini istememenizdir. Eğer yapmışlarsa, kuyruğu sürdürdüğünüzde hepsi arka arkaya programlanırdı. Kodunuza baktığınızda, muhtemelen olmayacak, bu sizin için işe yarayacaktır. Sadece akılda tutunuz ki, gönderim "sıraya koy" anlamına gelir. Askıya alınmayan kuyruklar, bloklarının sırayla programlanmasını sağlar.

4

: kendisi Burada

kod (bir soldurma durdurabilir veya onlar solan veya dışarıdayken karartmak için) (fadeIn ve delayFadeOut hem programın başlangıcında denir) Kuyrukları/iptal işlemlerini askıya almak için GCD yerine NSOperation ve NSOperationQueue kullanmalısınız. Bkz here. genel soru için

İlgili konular