照片框架:资产连接中断或资产死亡

时间:2015-01-13 04:23:02

标签: ios objective-c swift avfoundation photosframework

当我尝试使用此快速库(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()
}

任何想法都会很棒。

3 个答案:

答案 0 :(得分:15)

我有同样的“资产连接被中断或资产已经死亡”错误。

通常后跟内存警告。 我试图找到保留周期,但事实并非如此。

我遇到的问题与已知的事实有关,即任何 PHImageManager request...() resultHandler 块被而不是调用在主队列上。

因此,我们无法在这些块中直接运行 UIView 代码,而不会在应用程序生命周期中遇到麻烦。

为了解决这个问题,我们可以运行所有 UIView 代码,这些代码将在dispatch_async(dispatch_get_main_queue(), block)

内的 resultHandler 块的范围内执行

我遇到了这个问题,因为我没有意识到我在我的应用程序的 resultHandler .s之一中调用的一个函数最终调用了一些 UIView 编码下线。 所以我没有将该调用转发给主线程。

希望这有帮助。

答案 1 :(得分:3)

发生此问题仅是因为TargetSize。罪魁祸首是PHImageManagerMaximumSize选项。根据需要为图像视图设置CGSIZE。

答案 2 :(得分:0)

您的问题可能是每次开始播放视频时都会创建一个新的Player-object:

 self.currentlyPlaying = Player()

我建议您在文件播放完毕后将其删除,或者创建一个您将重复使用的播放器。否则它将留在memory.v