2015-01-13 19 views
6

Otrzymuję ten błąd, gdy próbuję odtwarzać wiele filmów wideo przy użyciu tej biblioteki swift (https://github.com/piemonte/player). Nie jestem pewien, czy jest to związane z tym odtwarzaczem, czy z ramą Photos, czy co.Schemat zdjęć: Połączenie z assetd zostało przerwane lub assetsd zmarł

Co się stanie, mam widok, który wyświetli zdjęcie lub wideo. Wszystko działa dobrze kilka razy, aż kilka filmów wideo zagrało, a następnie pojawi się ta wiadomość, a następnie wszystkie filmy nie są w stanie grać, a na ich miejscu po prostu pojawi się czarny ekran, a następnie dostaję błąd użycia pamięci.

Używam biblioteki o nazwie SwipeView, a tutaj jest kilka przydatnych kodów, które mogą być pomocne.

func swipeView(swipeView: SwipeView!, viewForItemAtIndex index: Int, reusingView view: UIView!) -> UIView! { 
    let asset: PHAsset = self.photosAsset[index] as PHAsset 

    // Create options for retrieving image (Degrades quality if using .Fast) 
    //  let imageOptions = PHImageRequestOptions() 
    //  imageOptions.resizeMode = PHImageRequestOptionsResizeMode.Fast 
    var imageView: UIImageView! 

    let screenSize: CGSize = UIScreen.mainScreen().bounds.size 
    let targetSize = CGSizeMake(screenSize.width, screenSize.height) 

    var options = PHImageRequestOptions() 
    options.resizeMode = PHImageRequestOptionsResizeMode.Exact 
    options.synchronous = true 

    if (asset.mediaType == PHAssetMediaType.Image) { 
     PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: .AspectFill, options: options, resultHandler: {(result, info) in 
      if (result.size.width > 200) { 
       imageView = UIImageView(image: result) 
      } 
     }) 

     return imageView 
    } else if (asset.mediaType == PHAssetMediaType.Video) { 
     self.currentlyPlaying = Player() 


     PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {result, audio, info in 
      self.currentlyPlaying.delegate = self 
      self.currentlyPlaying.playbackLoops = true 
      self.addChildViewController(self.currentlyPlaying) 
      self.currentlyPlaying.didMoveToParentViewController(self) 

      var t = result as AVURLAsset 
      var url = t.valueForKey("URL") as NSURL 
      var urlString = url.absoluteString 

      self.currentlyPlaying.path = urlString 
     }) 

     return self.currentlyPlaying.view 
    } 
    return UIView() 
} 


    func swipeViewItemSize(swipeView: SwipeView!) -> CGSize { 
    return self.swipeView.bounds.size; 
} 

func swipeView(swipeView: SwipeView!, didSelectItemAtIndex index: Int) { 
    self.currentlyPlaying.playFromBeginning() 
} 

func swipeViewCurrentItemIndexDidChange(swipeView: SwipeView!) { 
    self.currentlyPlaying.stop() 
} 

Wszelkie myśli byłyby świetne.

+1

Wygląda na to, że za każdym razem, gdy odtwarzany jest film, tworzysz nowy 'Player()' i dodajesz go jako kontroler widoku podrzędnego. Czy zdarza Ci się go usunąć po zakończeniu? To może spowodować problemy z pamięcią. – Jack

+0

@JackWu. Och, to chyba to. Przyjrzę się temu później, dzięki! – Jonovono

Odpowiedz

0

Twój problem może być utworzenie nowego gracza-obiektowe za każdym uruchomieniu odtwarzania wideo:

self.currentlyPlaying = Player() 

Polecam Ci go usunąć po plik zakończeniu odtwarzania lub utworzenie jednego gracza, który będziesz ponownie wykorzystany. W przeciwnym razie pozostanie on w pamięci.v

14

Miałem to samo "Połączenie z assetd zostało przerwane lub assetd umarł" błąd.

Zwykle następuje ostrzeżenie o pamięci . Próbowałem znaleźć cykle zatrzymania, ale to nie było to.

Problemem dla mnie miał do czynienia ze znanym faktem, że resultHandler blok każdej PHImageManagerrequest...() jest nie wezwał głównego kolejki.

Nie możemy zatem uruchomić kodu UIView bezpośrednio w tych blokach bez pytania o kłopoty w późniejszym życiu aplikacji.

Aby rozwiązać ten problem, możemy na przykład uruchomić wszystkie UIView kod która ma być wykonywana w zakresie resultHandler bloku Wewnątrz dispatch_async(dispatch_get_main_queue(), block)

miałem ten problem, bo nie wiedzieli, że jeden z Funkcje, które wywoływałam w jednym z wyników resultHandler .s mojej aplikacji, w końcu wywoływały jakiś kod UIView. I tak nie przekazywałem tego połączenia do głównego wątku.

Mam nadzieję, że to pomoże.

Powiązane problemy