2015-01-13 8 views
6

Ich erhalte diesen Fehler, wenn ich versuche, mehrere Videos mit dieser schnellen Bibliothek (https://github.com/piemonte/player) zu spielen. Nicht sicher, ob es mit diesem Player oder mit dem Photos-Framework oder was auch immer zusammenhängt.Fotos Rahmen: Verbindung zu Assetsd wurde unterbrochen oder Assetsd starb

Was passiert ist, habe ich eine Ansicht, die entweder ein Foto oder ein Video anzeigen wird. Alles funktioniert gut ein paar Mal, bis ein paar Videos abgespielt haben und dann erscheint diese Nachricht, gefolgt von allen Videos, die nicht abgespielt werden können und an ihrer Stelle sieht man nur einen schwarzen Bildschirm und dann bekomme ich einen Speicherverbrauchsfehler.

Ich benutze eine Bibliothek namens SwipeView und hier ist einige relevante Code, der hilfreich sein kann.

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

Alle Gedanken wären großartig.

+1

Es sieht so aus, als ob jedes Mal, wenn ein Video abgespielt wird, ein neuer 'Player()' erstellt und als Child-View-Controller hinzugefügt wird. Entfernen Sie es jemals, wenn es fertig ist? Das könnte Speicherprobleme verursachen. – Jack

+0

@JackWu. Oh, das ist es wahrscheinlich. Ich werde mir das später ansehen, danke! – Jonovono

Antwort

0

Ihr Problem könnte sein, dass Sie ein neues Spieler-Objekt jedes Mal wenn Sie ein Video starten erstellen spielen:

self.currentlyPlaying = Player() 

würde Sie empfehle ich es entweder zu entfernen, nachdem die Datei beendet hat zu spielen oder einen Spieler zu schaffen, Sie werden wiederverwenden. Sonst bleibt es im Speicher.

14

Ich hatte das gleiche "Verbindung zu Assetsd wurde unterbrochen oder Assetsd starb" Fehler.

Normalerweise wird gefolgt von einer Speicherwarnung. Ich habe versucht, Retain-Zyklen zu finden, aber das war es nicht.

Das Problem für mich hatte mit der bekannten Tatsache zu tun, dass der resultHandler Block jeden PHImageManagerrequest...()nicht auf der Hauptwarteschlange genannt wird.

So können wir nicht UIView Code direkt in diesen Blöcken ohne nach Ärger später in der App Leben zu fragen.

Um dies zu beheben, wir können zum Beispiel alle UIView Code ausführen, die in einem im Rahmen des resultHandler Block ausgeführt werden würde dispatch_async(dispatch_get_main_queue(), block)

ich dieses Problem hatte, weil ich nicht, dass einer von ahnten die Funktionen, die ich innerhalb eines der resultHandler .s meiner App aufgerufen habe, rief schließlich einige UIView Code auf der ganzen Linie. Und so habe ich diesen Anruf nicht an den Haupt-Thread weitergeleitet.

Hoffe, das hilft.

Verwandte Themen