2015-01-13 2 views
6

Я получаю эту ошибку, когда пытаюсь воспроизвести несколько видео с помощью этой быстрой библиотеки (https://github.com/piemonte/player). Не уверен, связано ли это с этим игроком или с фреймворком или что-то еще.Фотографии рамки: Соединение с активами было прервано или активы умерли

Что происходит, у меня есть представление, которое отобразит либо фотографию, либо видео. Все работает отлично несколько раз, пока не воспроизводится несколько видеороликов, и тогда появится это сообщение, за которым последуют все видео, которые не могут воспроизводиться, а на их месте вы видите черный экран, а затем я получаю ошибку использования памяти.

Я использую библиотеку под названием 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() 
} 

Любые мысли были бы замечательными.

+1

Похоже, что каждый раз, когда воспроизводится видео, вы создаете новый 'Player()' и добавляете его в качестве контроллера детского представления. Вы когда-нибудь удаляете его, когда это делается? Это может вызвать проблемы с памятью. – Jack

+0

@JackWu. О, это, наверное, так. Я посмотрю на это позже, спасибо! – Jonovono

ответ

0

Ваша проблема может быть, что вы создаете новый плеер-объект каждый раз, когда вы запускаете воспроизведение видео:

self.currentlyPlaying = Player() 

Я бы рекомендовал вам либо удалить его после того, как файл закончил играть или создать один игрок, который вы будете повторно использовать. В противном случае он останется в памяти. V

14

У меня было это "Соединение с активами было прервано или скончалось имущество с ошибкой".

Обычно следует предупреждение об ошибке. Я попытался найти циклы сохранения, но это было не так.

Проблемой для меня было связано с известным фактом, что ResultHandler блок любого PHImageManagerrequest...() является не называется на главной очереди.

Таким образом, мы не можем запускать код UIView непосредственно в пределах этих блоков, не задавая проблем в будущем приложения.

Чтобы исправить это можно, например, запустить все UIView код, который будет выполняться в пределах объема ResultHandler блока Внутри dispatch_async(dispatch_get_main_queue(), block)

Я с этой проблемой, потому что я не понимаю, что один из функции, которые я вызывал в одном из результатов моего приложения, в конечном итоге вызывали код UIView. И поэтому я не переадресовал этот вызов в основной поток.

Надеюсь, это поможет.