首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPhotoLibrary - photoLibraryDidChange在Swift中多次调用

PHPhotoLibrary - photoLibraryDidChange在Swift中多次调用
EN

Stack Overflow用户
提问于 2017-03-08 04:02:00
回答 3查看 2.2K关注 0票数 4

我有以下代码:

代码语言:javascript
复制
override func viewDidLoad() {
    ........
    PHPhotoLibrary.shared().register(self)
}

我已经实现了PHPhotoLibraryDidChangeObserver

我的问题是,如果设备库中的内容发生变化,photoLibraryDidChange方法会被多次调用。

下面是该函数的代码:

代码语言:javascript
复制
func photoLibraryDidChange(_ changeInstance: PHChange) {
    DispatchQueue.main.async(execute: {
        self.updateFetchResult();
    })
}

你知道为什么这个方法会被执行multiple次吗?

EN

回答 3

Stack Overflow用户

发布于 2017-07-08 00:39:28

你找到解决方案了吗?这就是解决mi问题:

首先,如果您使用此方法,请在调用PHAsset.fetchAssets(with:options:)时保存您的PHFetResult<PHAsset>

之后,使用PHFetResult<PHAsset>变量验证获取结果是否在photoLibraryDidChange:方法中发生了更改。第一次调用此方法时,必须更新为集合视图或表视图。在那之后,你的抓取结果并没有改变,所以...您没有要更新的内容。

这是我的完整代码:

代码语言:javascript
复制
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

self.fetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)

.
.
.

extension YourViewController: PHPhotoLibraryChangeObserver {

    func photoLibraryDidChange(_ changeInstance: PHChange) {
        if let _fetchResult = self.fetchResult, let _ = changeInstance.changeDetails(for: _fetchResult) {
            DispatchQueue.main.async {
                self.getPhotos()
            }
        }
    }

}

希望这对你有帮助!

票数 0
EN

Stack Overflow用户

发布于 2018-05-30 23:27:57

代码语言:javascript
复制
extension YourViewController: PHPhotoLibraryChangeObserver {

    func photoLibraryDidChange(_ changeInstance: PHChange) {
        if let _fetchResult = self.fetchResult, let resultDetailChanges = changeInstance.changeDetails(for: _fetchResult) {
            let addedItems = resultDetailChanges.insertedObjects
            let deletedItems = resultDetailChanges.removedObjects
            let changedItems = resultDetailChanges.changedObjects
            if resultDetailChanges.hasIncrementalChanges && (addedItems.count > 0 || deletedItems.count > 0 || changedItems.count > 0){
                DispatchQueue.main.async {
                    self.getPhotos()
                }
            }
        }
    }

}

以上检查resultDetailChanges.hasIncrementalChanges和计数(添加、删除、更改资产)将起到保护作用,以避免多次调用。

票数 0
EN

Stack Overflow用户

发布于 2020-05-27 16:52:25

试试这条路

代码语言:javascript
复制
extension YourViewController: PHPhotoLibraryChangeObserver {

        func photoLibraryDidChange(_ changeInstance: PHChange) {
            if let _fetchResult = self.fetchResult, let resultDetailChanges = changeInstance.changeDetails(for: _fetchResult) {
                let insertedObjects = resultDetailChanges.insertedObjects
                let removedObjects = resultDetailChanges.removedObjects
                let changedObjects = resultDetailChanges.changedObjects.filter( {
                    return changeInstance.changeDetails(for: $0)?.assetContentChanged == true
                })
                if resultDetailChanges.hasIncrementalChanges && (insertedObjects.count > 0 || removedObjects.count > 0 || changedObjects.count > 0){
                    DispatchQueue.main.async {
                        self.getPhotos()
                    }
                }
            }
        }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42657266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档