Фреймворк фотографий: подключение к assetsd было прервано или активы умерли

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

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

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

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


person Jonovono    schedule 13.01.2015    source источник
comment
Похоже, что каждый раз, когда воспроизводится видео, вы создаете новый Player() и добавляете его в качестве дочернего контроллера представления. Вы когда-нибудь удаляете его, когда он готов? Это может вызвать проблемы с памятью.   -  person Jack    schedule 15.01.2015
comment
@ДжекВу. О, это, наверное, так. Я посмотрю на это позже, спасибо!   -  person Jonovono    schedule 15.01.2015


Ответы (3)


У меня была такая же ошибка «Соединение с активами было прервано или активы умерли».

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

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

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

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

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

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

person SirEnder    schedule 18.04.2015

Проблема возникает только из-за TargetSize. Параметр PHImageManagerMaximumSize является виновником. Установите CGSIZE, как вы хотите для просмотра изображения.

person jagen    schedule 07.09.2018

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

 self.currentlyPlaying = Player()

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

person Christian    schedule 21.01.2015