1

所以我在这里查看照片 API 和 Apple 的示例代码 https://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html 并在此处快速转换为 https://github.com /ooper-shlab/SamplePhotosApp-Swift

我已将代码集成到我的项目中,以便在我拍照时 collectionView 从库中成功更新自身。有一个怪癖:有时单元格是空白的,并且它似乎连接到每次在 photoLibraryDidChange 委托方法结束时更新库时 Apple 调用的 stopCachingImagesForAllAssets。

我可以删除这条线并解决问题,但肯定有苹果把它放在那里的原因吗?我关心内存使用情况。

 // MARK: - PHPhotoLibraryChangeObserver

func photoLibraryDidChange(changeInstance: PHChange) {
    // Check if there are changes to the assets we are showing.
    guard let
        assetsFetchResults = self.assetsFetchResults,
        collectionChanges = changeInstance.changeDetailsForFetchResult(assetsFetchResults)
        else {return}

    /*
    Change notifications may be made on a background queue. Re-dispatch to the
    main queue before acting on the change as we'll be updating the UI.
    */
    dispatch_async(dispatch_get_main_queue()) {
        // Get the new fetch result.
        self.assetsFetchResults = collectionChanges.fetchResultAfterChanges

        let collectionView = self.pictureCollectionView!

        if !collectionChanges.hasIncrementalChanges || collectionChanges.hasMoves {
            // Reload the collection view if the incremental diffs are not available
            collectionView.reloadData()

        } else {
            /*
            Tell the collection view to animate insertions and deletions if we
            have incremental diffs.
            */
            collectionView.performBatchUpdates({
                if let removedIndexes = collectionChanges.removedIndexes
                    where removedIndexes.count > 0 {
                        collectionView.deleteItemsAtIndexPaths(removedIndexes.aapl_indexPathsFromIndexesWithSection(0))
                }

                if let insertedIndexes = collectionChanges.insertedIndexes
                    where insertedIndexes.count > 0 {
                        collectionView.insertItemsAtIndexPaths(insertedIndexes.aapl_indexPathsFromIndexesWithSection(0))
                }

                if let changedIndexes = collectionChanges.changedIndexes
                    where changedIndexes.count > 0 {
                        collectionView.reloadItemsAtIndexPaths(changedIndexes.aapl_indexPathsFromIndexesWithSection(0))
                }
                }, completion:  nil)
        }

        self.resetCachedAssets() //perhaps prevents memory warning but causes the empty cells
    }
}

//MARK: - Asset Caching

private func resetCachedAssets() {
    self.imageManager?.stopCachingImagesForAllAssets()
    self.previousPreheatRect = CGRectZero
}
4

1 回答 1

1

我得到了同样的结果。这是为我解决问题的方法:

由于performBatchUpdates是异步的,因此resetCachedAssets可能在删除/插入/重新加载发生时执行,甚至在这些之间执行。

这对我来说听起来不太好。所以我移动了这条线:

self.resetCachedAssets()

dispatch_async块的第一行。

我希望这对你也有帮助。

于 2016-04-05T18:14:11.037 回答