2015-01-13 10 views
6

この迅速なライブラリ(https://github.com/piemonte/player)を使用して複数の動画を再生しようとすると、このエラーが発生します。そのプレイヤーやPhotosフレームワークに関係があるかどうかは分かりません。何が起こる写真のフレームワーク:assetsdへの接続が中断された、または資産が死亡しました

は私が写真やビデオのいずれかを表示するビューを持っている、です。いくつかのビデオが再生されてからこのメッセージがポップアップ表示されるまで、すべてのビデオがうまく動作し、再生できないすべてのビデオが表示され、黒い画面が表示された後、メモリ使用エラーが発生します。私はここにSwipeViewと呼ばれるライブラリを使用しています

は役立つかもしれないいくつかの関連するコードです。

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

どのような考えも大きいでしょう。ファイルの再生が終了したか、一人のプレイヤーこれを作成するためにした後、私はそれを削除するか、あなたをお勧めします

self.currentlyPlaying = Player() 

+1

は、新しい 'プレイヤーを()'作成し、子ビューコントローラとして追加します。あなたはそれが完了したらそれを削除しますか?それはメモリの問題を引き起こす可能性があります。 @BackWu。 – Jack

+0

。ああ、それはおそらくそれです。私はそれを後で見てみましょう、ありがとう! – Jonovono

答えて

0

あなたの問題は、あなたがビデオの再生を開始し、新規プレイヤー・オブジェクト毎回作成することであるかもしれませんあなたは再利用します。それ以外の場合はメモリに残ります.v

14

私はこれと同じ "アセットへの接続が中断されたか、資産が死んで"というエラーが発生しました。

通常、メモリ警告が続きます。 私は保持サイクルを見つけようとしましたが、そうではありませんでした。

私にとっての問題は、どのPHImageManagerrequest...()resultHandlerブロックがメインキューで呼び出さないであることは周知の事実としなければなりませんでした。

UIViewのコードは、後でアプリの生活の中でトラブルを尋ねることなくブロック内で直接実行することはできません。我々は、例えば、私はの1つを実現していなかったので、私はこの問題を抱えていたdispatch_async(dispatch_get_main_queue(), block)

resultHandlerブロックの範囲内で実行されるすべてののUIViewコードを実行することがあり、この問題を修正するには

私がresultHandlerのうちの1つの中で呼び出す関数は、最終的にはUIViewコードを呼び出していました。 そして私はその呼び出しをメインスレッドに転送していませんでした。

これが役に立ちます。これは、ビデオが再生されるたびにように見える

関連する問題