2013-04-27 29 views
5

Bir video oynatılır yapılır tamamlanmaz bir metin görüntüleniyor. Bunu başarmak için bir bildirim tekniği kullanıyorum. Tek sorun, Gözlemcinin şimdi ve sonra iki kere çağrılmasıdır. "ItemDidFinishPlaying" öğesini iki kez (ve dolayısıyla aynı adın yöntemini) tetikler. Ne zaman olduğunu tahmin edemem. Nedenini bilmiyorum. Rastgele görünüyor (bu garip sesler biliyorum) iyi çalışıyorsa, arka arkaya 15 kez söyleyelim ve bir dahaki sefere bu davranış maviden meydana geliyor. Ben bir yeniden yapmak ve uygulamayı çalıştırın ve bu kez iki kez, gözlemci çağırmadan önce üst üste 19 kez iyi çalışır ... Tahmin edilemez. Düzeltmek için hatayı tahmin etmek için her senaryoyu denedim. Şimdiye kadar imkansızdı. Yani 2 sorum var.Gözlemci NSNotification (itemDidFinishPlaying) RANDOMLY iki kez çağrıldı

1) Neden "rastgele" oluyor?

2) Bu çifte arama sorunu nasıl giderilir?

Ayrıca bu 2 Aşağıdaki konuşmalar yardımcı olamadım:

Why the Observer in NSNotification called twice....?

How to stop the Observer in NSNotification to called twice?

aşağıda kodumu bulabilirsiniz:

- (void) playAnimation: (NSString *) theString { 

UIView *thisCurrentView = self.currentView; 
UIView *thisReplacementView = [[UIView alloc] init]; 

//[avPlayer pause]; 
[self replaceView: thisCurrentView withView: thisReplacementView]; 

NSString *filepath = [[NSBundle mainBundle] pathForResource:theString ofType:@"mov"]; 
NSURL *fileURL = [NSURL fileURLWithPath:filepath]; 


// First create an AVPlayerItem 
AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:fileURL]; 

// Subscribe to the AVPlayerItem's DidPlayToEndTime notification. 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem]; 

// Pass the AVPlayerItem to a new player 
controlledPlayer = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 


AVPlayerLayer *animatedLayer = [AVPlayerLayer playerLayerWithPlayer:controlledPlayer]; 


[animatedLayer setFrame:CGRectMake(0, 0, 1024, 1024)]; 
[thisReplacementView.layer addSublayer: animatedLayer]; 


// Begin playback 
[controlledPlayer play]; 

// Clear some content 
[self displayNoContent]; 

pageContent = theString; 


playingStatus = YES; 

}

- (boşluk) itemDidFinishPlaying {

[self displayContent: pageContent]; 

}

+0

Bildirim oynatıcınızı video oynatma düğmesi eylemine ekliyor musunuz? – NSUserDefault

+0

@NSUserDefault, düğme yok. Sadece gezinmek için kaydırıyorum. Animasyon, sayfa görüntülendiğinde oynatılır. – Armand

+0

bu noktada - (void) playAnimation: (NSString *) theString yöntemini çağırıyorsunuz? – NSUserDefault

cevap

7

bu deneyin,

-(void)itemDidFinishPlaying { 

     [self displayContent: pageContent]; 
     [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem]; 

} 

Bu sizin için çalışabilir.

Edit1: Aşağıda scenario.It sağlayacak yeni one.Try ayarlamadan önce

(hatta hiçbir problem yok) bir önceki gözlemci kaldırmak, bildirim izleyiciye her zamanı çıkarın ve yenisini ekler.

+0

Üzgünüm, işe yaramadı. – Armand

+0

Şimdilik metni yalnızca bir kez basmak için koşullu bir açıklama ile çözüyorum. Bu yüzden, bildirim bir defada ikinci kez gerçekleşirse, metni yalnızca bir kez görüntüler. Etrafta en seksi yaklaşım değil ama şimdilik ilerlememi sağlıyor. – Armand

+0

Bu hat şu ana kadar çalışıyor ... Teşekkürler [[NSNotificationCenter defaultCenter] removeObserver: self]; – Armand

1

Bu yalnızca AirPlay sırasında gerçekleşir. Yinelenen bildirimi yok saymak için aşağıdaki geçici çözümü kullanıyorum.

if ([notificaiton.object isEqual:self.player.currentItem] && (self.player.rate > 0)) 
{ 
    [self.player pause]; 

    //Do your stuff here. 
} 

NSUserDefault cevabı da çalışır ama sonra tekrar gözlemci eklemek ve ayarlarınıza göre karmaşık hale gelecek var.

İlgili konular